From 32963115e25ed5c6016e73a66f39b9c9e5c48f72 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 11:36:44 +0800 Subject: [PATCH 01/34] Add ChangePrivacyCommandParser --- .../parser/ChangePrivacyCommandParser.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java diff --git a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java new file mode 100644 index 000000000000..45e9ad269da9 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java @@ -0,0 +1,80 @@ +package seedu.address.logic.parser; + +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; +import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; + +import seedu.address.commons.core.index.Index; +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.logic.commands.ChangePrivacyCommand; +import seedu.address.logic.commands.ChangePrivacyCommand.PersonPrivacySettings; +import seedu.address.logic.parser.exceptions.ParseException; + +/** + * Parses input arguments and creates a new ChangePrivacyCommand object + */ +public class ChangePrivacyCommandParser { + /** + * Parses the given {@code String} of arguments in the context of the EditCommand + * and returns an EditCommand object for execution. + * @throws ParseException if the user input does not conform the expected format + */ + public ChangePrivacyCommand parse(String args) throws ParseException { + requireNonNull(args); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG); + + Index index; + + try { + index = ParserUtil.parseIndex(argMultimap.getPreamble()); + + } catch (IllegalValueException ive) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + } + + PersonPrivacySettings pps = new PersonPrivacySettings(); + + if (argMultimap.getValue(PREFIX_NAME).isPresent()) { + if (argMultimap.getValue(PREFIX_NAME).equals("true")) { + pps.setNameIsPrivate(true); + } else if (argMultimap.getValue(PREFIX_NAME).equals("false")) { + pps.setNameIsPrivate(false); + } + } + + if (argMultimap.getValue(PREFIX_PHONE).isPresent()) { + if (argMultimap.getValue(PREFIX_PHONE).equals("true")) { + pps.setPhoneIsPrivate(true); + } else if (argMultimap.getValue(PREFIX_PHONE).equals("false")) { + pps.setPhoneIsPrivate(false); + } + } + + if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) { + if (argMultimap.getValue(PREFIX_EMAIL).equals("true")) { + pps.setEmailIsPrivate(true); + } else if (argMultimap.getValue(PREFIX_EMAIL).equals("false")) { + pps.setEmailIsPrivate(false); + } + } + + if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { + if (argMultimap.getValue(PREFIX_ADDRESS).equals("true")) { + pps.setAddressIsPrivate(true); + } else if (argMultimap.getValue(PREFIX_ADDRESS).equals("false")) { + pps.setAddressIsPrivate(false); + } + } + + if (!pps.isAnyFieldNonNull()) { + throw new ParseException(ChangePrivacyCommand.MESSAGE_NO_FIELDS); + } + + return new ChangePrivacyCommand(index, pps); + } +} From 169a86fadae125d598cbd246cd41d3506ffeaebd Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 14:48:27 +0800 Subject: [PATCH 02/34] Modify ChangePrivacyCommand to update Model --- .../logic/commands/ChangePrivacyCommand.java | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index 686fa1b4515a..86ab7722aed5 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -6,14 +6,24 @@ 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.List; +import java.util.Set; import seedu.address.commons.core.Messages; import seedu.address.commons.core.index.Index; import seedu.address.commons.util.CollectionUtil; import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.model.person.Address; +import seedu.address.model.person.Email; +import seedu.address.model.person.Name; +import seedu.address.model.person.Person; +import seedu.address.model.person.Phone; import seedu.address.model.person.ReadOnlyPerson; +import seedu.address.model.person.exceptions.DuplicatePersonException; +import seedu.address.model.person.exceptions.PersonNotFoundException; +import seedu.address.model.tag.Tag; /** * Changes the privacy setting of a person's details in the address book @@ -39,6 +49,7 @@ public class ChangePrivacyCommand extends UndoableCommand { public static final String MESSAGE_CHANGE_PRIVACY_SUCCESS = "Changed the Privacy of the Person: %1$s"; public static final String MESSAGE_NO_FIELDS = "At least one field to change must be provided."; + public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book."; private final Index index; private final PersonPrivacySettings pps; @@ -64,9 +75,18 @@ public CommandResult executeUndoableCommand() throws CommandException { ReadOnlyPerson personToChange = lastShownList.get(index.getZeroBased()); - changePersonPrivacy(personToChange, pps); + Person newPerson = createPersonWithChangedPrivacy(personToChange, pps); - return new CommandResult(String.format(MESSAGE_CHANGE_PRIVACY_SUCCESS, personToChange)); + try { + model.updatePerson(personToChange, newPerson); + } catch (DuplicatePersonException dpe) { + throw new CommandException(MESSAGE_DUPLICATE_PERSON); + } catch (PersonNotFoundException pnfe) { + throw new AssertionError("The target person cannot be missing"); + } + + model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); + return new CommandResult(String.format(MESSAGE_CHANGE_PRIVACY_SUCCESS, newPerson)); } /** @@ -74,21 +94,31 @@ public CommandResult executeUndoableCommand() throws CommandException { * @param person the person whose privacy we would like to change * @param pps the settings of privacy for each field */ - private static void changePersonPrivacy(ReadOnlyPerson person, PersonPrivacySettings pps) { + private static Person createPersonWithChangedPrivacy(ReadOnlyPerson person, PersonPrivacySettings pps) { + assert person != null; + + Name n = person.getName(); + Phone p = person.getPhone(); + Email e = person.getEmail(); + Address a = person.getAddress(); + Set t = person.getTags( ); + if (pps.nameIsPrivate() != null) { - person.getName().setPrivate(pps.nameIsPrivate()); + n.setPrivate(pps.nameIsPrivate()); } if (pps.phoneIsPrivate() != null) { - person.getPhone().setPrivate(pps.phoneIsPrivate()); + p.setPrivate(pps.phoneIsPrivate()); } if (pps.emailIsPrivate() != null) { - person.getEmail().setPrivate(pps.emailIsPrivate()); + e.setPrivate(pps.emailIsPrivate()); } if (pps.addressIsPrivate() != null) { - person.getAddress().setPrivate(pps.addressIsPrivate()); + a.setPrivate(pps.addressIsPrivate()); } + + return new Person(n, p, e, a, t); } /** From 4acbf4d377ed4dc85ef70e6fb30409def2ec3e42 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 14:55:30 +0800 Subject: [PATCH 03/34] Fix bug in detecting parsed values in ChangePrivacyCommandParser --- .../parser/ChangePrivacyCommandParser.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java index 45e9ad269da9..4c85d40fdaaa 100644 --- a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java @@ -40,33 +40,34 @@ public ChangePrivacyCommand parse(String args) throws ParseException { PersonPrivacySettings pps = new PersonPrivacySettings(); if (argMultimap.getValue(PREFIX_NAME).isPresent()) { - if (argMultimap.getValue(PREFIX_NAME).equals("true")) { + if (argMultimap.getValue(PREFIX_NAME).toString().equals("Optional[true]")) { pps.setNameIsPrivate(true); - } else if (argMultimap.getValue(PREFIX_NAME).equals("false")) { + + } else if (argMultimap.getValue(PREFIX_NAME).toString().equals("Optional[false]")) { pps.setNameIsPrivate(false); } } if (argMultimap.getValue(PREFIX_PHONE).isPresent()) { - if (argMultimap.getValue(PREFIX_PHONE).equals("true")) { + if (argMultimap.getValue(PREFIX_PHONE).toString().equals("Optional[true]")) { pps.setPhoneIsPrivate(true); - } else if (argMultimap.getValue(PREFIX_PHONE).equals("false")) { + } else if (argMultimap.getValue(PREFIX_PHONE).toString().equals("Optional[false]")) { pps.setPhoneIsPrivate(false); } } if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) { - if (argMultimap.getValue(PREFIX_EMAIL).equals("true")) { + if (argMultimap.getValue(PREFIX_EMAIL).toString().equals("Optional[true]")) { pps.setEmailIsPrivate(true); - } else if (argMultimap.getValue(PREFIX_EMAIL).equals("false")) { + } else if (argMultimap.getValue(PREFIX_EMAIL).toString().equals("Optional[false]")) { pps.setEmailIsPrivate(false); } } if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { - if (argMultimap.getValue(PREFIX_ADDRESS).equals("true")) { + if (argMultimap.getValue(PREFIX_ADDRESS).toString().equals("Optional[true]")) { pps.setAddressIsPrivate(true); - } else if (argMultimap.getValue(PREFIX_ADDRESS).equals("false")) { + } else if (argMultimap.getValue(PREFIX_ADDRESS).toString().equals("Optional[false]")) { pps.setAddressIsPrivate(false); } } From 435d7fb034cfc964f055cca5eb1fe957d1877379 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 14:55:54 +0800 Subject: [PATCH 04/34] Update AddressBookParser with ChangePrivacyCommandParser --- .../java/seedu/address/logic/parser/AddressBookParser.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index 7f8622fc2bc0..153635fe7094 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -9,6 +9,7 @@ import seedu.address.logic.commands.AddCommand; import seedu.address.logic.commands.AddTagCommand; import seedu.address.logic.commands.BackupCommand; +import seedu.address.logic.commands.ChangePrivacyCommand; import seedu.address.logic.commands.ClearCommand; import seedu.address.logic.commands.Command; import seedu.address.logic.commands.DeleteCommand; @@ -61,6 +62,10 @@ public Command parseCommand(String userInput) throws ParseException { case AddTagCommand.COMMAND_ALIAS: return new AddTagCommandParser().parse(arguments); + case ChangePrivacyCommand.COMMAND_WORD: + case ChangePrivacyCommand.COMMAND_ALIAS: + return new ChangePrivacyCommandParser().parse(arguments); + case EditCommand.COMMAND_WORD: case EditCommand.COMMAND_ALIAS: return new EditCommandParser().parse(arguments); From 299f15b14be3e5899a792efbb05b818b3f57fd75 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 17:13:12 +0800 Subject: [PATCH 05/34] Add interface for ChangePrivacyCommandParser --- .../seedu/address/logic/parser/ChangePrivacyCommandParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java index 4c85d40fdaaa..5cf0ea1a17aa 100644 --- a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java @@ -17,7 +17,7 @@ /** * Parses input arguments and creates a new ChangePrivacyCommand object */ -public class ChangePrivacyCommandParser { +public class ChangePrivacyCommandParser implements Parser { /** * Parses the given {@code String} of arguments in the context of the EditCommand * and returns an EditCommand object for execution. From bc6dc32f2fbf584354116019c99a3e1c15539475 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 17:25:38 +0800 Subject: [PATCH 06/34] Update MESSAGE_USAGE in ChangePrivacyCommand --- .../address/logic/commands/ChangePrivacyCommand.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index 86ab7722aed5..01ba5c8a09f1 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -36,16 +36,17 @@ public class ChangePrivacyCommand extends UndoableCommand { public static final String FALSE_WORD = "false"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Changes the privacy of the details of the person" - + "identified by the index number used in the last person listing.\n " + + " identified by the index number used in the last person listing.\n" + "Parameters: INDEX (must be a positive integer) " + "[" + PREFIX_NAME + TRUE_WORD + " OR " + FALSE_WORD + "]" + "[" + PREFIX_PHONE + TRUE_WORD + " OR " + FALSE_WORD + "]" + "[" + PREFIX_EMAIL + TRUE_WORD + " OR " + FALSE_WORD + "]" - + "[" + PREFIX_ADDRESS + TRUE_WORD + " OR " + FALSE_WORD + "]" - + "[" + PREFIX_TAG + TRUE_WORD + " OR " + FALSE_WORD + "]...\n" + + "[" + PREFIX_ADDRESS + TRUE_WORD + " OR " + FALSE_WORD + "]\n" + "Example: " + COMMAND_WORD + " 1 " - + PREFIX_PHONE + TRUE_WORD - + PREFIX_EMAIL + FALSE_WORD; + + PREFIX_NAME + TRUE_WORD + " " + + PREFIX_PHONE + FALSE_WORD + " " + + PREFIX_EMAIL + TRUE_WORD + " " + + PREFIX_ADDRESS + FALSE_WORD; public static final String MESSAGE_CHANGE_PRIVACY_SUCCESS = "Changed the Privacy of the Person: %1$s"; public static final String MESSAGE_NO_FIELDS = "At least one field to change must be provided."; From f9edef170ba4745efa6c5a1ed1b0fe78d939ac8c Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 17:26:49 +0800 Subject: [PATCH 07/34] Add ParseException when non boolean arguments are used --- .../logic/parser/ChangePrivacyCommandParser.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java index 5cf0ea1a17aa..523fd0d53da9 100644 --- a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java @@ -46,6 +46,9 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_NAME).toString().equals("Optional[false]")) { pps.setNameIsPrivate(false); } + else { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + } } if (argMultimap.getValue(PREFIX_PHONE).isPresent()) { @@ -54,6 +57,9 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_PHONE).toString().equals("Optional[false]")) { pps.setPhoneIsPrivate(false); } + else { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + } } if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) { @@ -62,6 +68,9 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_EMAIL).toString().equals("Optional[false]")) { pps.setEmailIsPrivate(false); } + else { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + } } if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { @@ -70,6 +79,9 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_ADDRESS).toString().equals("Optional[false]")) { pps.setAddressIsPrivate(false); } + else { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + } } if (!pps.isAnyFieldNonNull()) { From 5004a685199a7bf693f7ef47af43eb22ed166151 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 17:28:05 +0800 Subject: [PATCH 08/34] Fix typo in ChangePrivacyCommandParser --- .../logic/parser/ChangePrivacyCommandParser.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java index 523fd0d53da9..b712e3be5d20 100644 --- a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java @@ -45,8 +45,7 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_NAME).toString().equals("Optional[false]")) { pps.setNameIsPrivate(false); - } - else { + } else { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); } } @@ -56,8 +55,7 @@ public ChangePrivacyCommand parse(String args) throws ParseException { pps.setPhoneIsPrivate(true); } else if (argMultimap.getValue(PREFIX_PHONE).toString().equals("Optional[false]")) { pps.setPhoneIsPrivate(false); - } - else { + } else { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); } } @@ -67,8 +65,7 @@ public ChangePrivacyCommand parse(String args) throws ParseException { pps.setEmailIsPrivate(true); } else if (argMultimap.getValue(PREFIX_EMAIL).toString().equals("Optional[false]")) { pps.setEmailIsPrivate(false); - } - else { + } else { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); } } @@ -78,8 +75,7 @@ public ChangePrivacyCommand parse(String args) throws ParseException { pps.setAddressIsPrivate(true); } else if (argMultimap.getValue(PREFIX_ADDRESS).toString().equals("Optional[false]")) { pps.setAddressIsPrivate(false); - } - else { + } else { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); } } From 1e7761dcbdb2ce9253b61b496ef55e85362aaa17 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 17:36:00 +0800 Subject: [PATCH 09/34] Add failure test cases for ChangePrivacyCommandParser --- .../ChangePrivacyCommandParserTest.java | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java diff --git a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java new file mode 100644 index 000000000000..4e386767f1d8 --- /dev/null +++ b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java @@ -0,0 +1,88 @@ +package seedu.address.logic.parser; + +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; +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; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY; +import static seedu.address.logic.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; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; + +import org.junit.Test; + +import seedu.address.logic.commands.ChangePrivacyCommand; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Email; +import seedu.address.model.person.Name; +import seedu.address.model.person.Phone; +import seedu.address.model.tag.Tag; + +public class ChangePrivacyCommandParserTest { + + private static final String MESSAGE_INVALID_FORMAT = + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE); + + private ChangePrivacyCommandParser parser = new ChangePrivacyCommandParser(); + + @Test + public void parse_missingParts_failure() { + // no index specified + assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT); + + // no field specified + assertParseFailure(parser, "1", ChangePrivacyCommand.MESSAGE_NO_FIELDS); + + // no index and no field specified + assertParseFailure(parser, "", MESSAGE_INVALID_FORMAT); + } + + @Test + public void parse_invalidPreamble_failure() { + // negative index + assertParseFailure(parser, "-5" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT); + + // zero index + assertParseFailure(parser, "0" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT); + + // invalid arguments being parsed as preamble + assertParseFailure(parser, "1 some random string", MESSAGE_INVALID_FORMAT); + + // invalid prefix being parsed as preamble + assertParseFailure(parser, "1 i/ string", MESSAGE_INVALID_FORMAT); + } + + @Test + public void parse_invalidValue_failure() { + // Non boolean argument + assertParseFailure(parser, "1" + " " + PREFIX_NAME + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "1" + " " + PREFIX_PHONE + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "1" + " " + PREFIX_EMAIL + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "1" + " " + PREFIX_ADDRESS + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + + // valid value followed by invalid value. The test case for invalid value followed by valid value + // is tested at {@code parse_invalidValueFollowedByValidValue_success()} + assertParseFailure(parser, "1" + " " + PREFIX_NAME + "true" + " " + PREFIX_NAME + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "1" + " " + PREFIX_PHONE + "true" + " " + PREFIX_PHONE + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "1" + " " + PREFIX_EMAIL + "true" + " " + PREFIX_EMAIL + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "1" + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_ADDRESS + "notBoolean", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + } +} From 0bf08e5a055fb3daea3b2466b84b1bc9079d73c9 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 17:38:01 +0800 Subject: [PATCH 10/34] Fix checkstyle in ChangePrivacyCommand and ChangePrivacyCommandParser --- .../address/logic/commands/ChangePrivacyCommand.java | 2 +- .../logic/parser/ChangePrivacyCommandParser.java | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index 01ba5c8a09f1..443138cbcea8 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -102,7 +102,7 @@ private static Person createPersonWithChangedPrivacy(ReadOnlyPerson person, Pers Phone p = person.getPhone(); Email e = person.getEmail(); Address a = person.getAddress(); - Set t = person.getTags( ); + Set t = person.getTags(); if (pps.nameIsPrivate() != null) { n.setPrivate(pps.nameIsPrivate()); diff --git a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java index b712e3be5d20..52e6f31a45b2 100644 --- a/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ChangePrivacyCommandParser.java @@ -46,7 +46,8 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_NAME).toString().equals("Optional[false]")) { pps.setNameIsPrivate(false); } else { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + ChangePrivacyCommand.MESSAGE_USAGE)); } } @@ -56,7 +57,8 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_PHONE).toString().equals("Optional[false]")) { pps.setPhoneIsPrivate(false); } else { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + ChangePrivacyCommand.MESSAGE_USAGE)); } } @@ -66,7 +68,8 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_EMAIL).toString().equals("Optional[false]")) { pps.setEmailIsPrivate(false); } else { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + ChangePrivacyCommand.MESSAGE_USAGE)); } } @@ -76,7 +79,8 @@ public ChangePrivacyCommand parse(String args) throws ParseException { } else if (argMultimap.getValue(PREFIX_ADDRESS).toString().equals("Optional[false]")) { pps.setAddressIsPrivate(false); } else { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + ChangePrivacyCommand.MESSAGE_USAGE)); } } From 386c55e754576d0f72ba5cc3210c2e14fc768807 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 17:47:42 +0800 Subject: [PATCH 11/34] Fix checkstyle in ChangePrivacyCommand --- .../logic/commands/ChangePrivacyCommand.java | 1 - .../ChangePrivacyCommandParserTest.java | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index 443138cbcea8..2e438cb0ca51 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -5,7 +5,6 @@ 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; -import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; import java.util.List; diff --git a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java index 4e386767f1d8..4eb03773b9ce 100644 --- a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.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.commands.CommandTestUtil.ADDRESS_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; @@ -11,22 +12,31 @@ import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND; import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; import static seedu.address.logic.parser.CliSyntax.PREFIX_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; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; +import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON; import org.junit.Test; +import seedu.address.commons.core.index.Index; import seedu.address.logic.commands.ChangePrivacyCommand; +import seedu.address.logic.commands.EditCommand; import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; import seedu.address.model.tag.Tag; +import seedu.address.testutil.EditPersonDescriptorBuilder; public class ChangePrivacyCommandParserTest { @@ -85,4 +95,18 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, "1" + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_ADDRESS + "notBoolean", String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); } + + @Test + public void parse_allFieldsSpecified_success() { + Index targetIndex = INDEX_SECOND_PERSON; + String userInput = targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND + + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND; + + EditCommand.EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY) + .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) + .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); + EditCommand expectedCommand = new EditCommand(targetIndex, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } } From abc329ce8f9e653ff737c1acbf475e9cda28e6f3 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Sun, 22 Oct 2017 19:00:19 +0800 Subject: [PATCH 12/34] Update ChangePrivacyCommandParserTest --- .../ChangePrivacyCommandParserTest.java | 39 ------------------- 1 file changed, 39 deletions(-) diff --git a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java index 4eb03773b9ce..fb2be647e948 100644 --- a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java @@ -1,42 +1,17 @@ package seedu.address.logic.parser; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY; -import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; -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; -import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY; -import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB; -import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND; -import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; -import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY; -import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; -import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY; -import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; import static seedu.address.logic.parser.CliSyntax.PREFIX_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; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; -import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; -import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON; import org.junit.Test; -import seedu.address.commons.core.index.Index; import seedu.address.logic.commands.ChangePrivacyCommand; -import seedu.address.logic.commands.EditCommand; -import seedu.address.logic.parser.exceptions.ParseException; -import seedu.address.model.person.Email; -import seedu.address.model.person.Name; -import seedu.address.model.person.Phone; -import seedu.address.model.tag.Tag; -import seedu.address.testutil.EditPersonDescriptorBuilder; public class ChangePrivacyCommandParserTest { @@ -95,18 +70,4 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, "1" + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_ADDRESS + "notBoolean", String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); } - - @Test - public void parse_allFieldsSpecified_success() { - Index targetIndex = INDEX_SECOND_PERSON; - String userInput = targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND - + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND; - - EditCommand.EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY) - .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) - .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); - EditCommand expectedCommand = new EditCommand(targetIndex, descriptor); - - assertParseSuccess(parser, userInput, expectedCommand); - } } From 97ea849e50c04e757757d20e9255428f62eef440 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 00:36:16 +0800 Subject: [PATCH 13/34] Add PersonPrivacySettingsBuilder --- .../PersonPrivacySettingsBuilder.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/test/java/seedu/address/testutil/PersonPrivacySettingsBuilder.java diff --git a/src/test/java/seedu/address/testutil/PersonPrivacySettingsBuilder.java b/src/test/java/seedu/address/testutil/PersonPrivacySettingsBuilder.java new file mode 100644 index 000000000000..0b76340e83c5 --- /dev/null +++ b/src/test/java/seedu/address/testutil/PersonPrivacySettingsBuilder.java @@ -0,0 +1,90 @@ +package seedu.address.testutil; + +import seedu.address.logic.commands.ChangePrivacyCommand.PersonPrivacySettings; +import seedu.address.model.person.ReadOnlyPerson; + +/** + * A utility class to help with building PersonPrivacySettings objects. + */ +public class PersonPrivacySettingsBuilder { + + private PersonPrivacySettings pps; + public PersonPrivacySettingsBuilder() { + pps = new PersonPrivacySettings(); + } + + public PersonPrivacySettingsBuilder(PersonPrivacySettings pps) { + this.pps = new PersonPrivacySettings(pps); + } + + /** + * Returns an {@code PersonPrivacySettings} with fields containing {@code person}'s privacy details + */ + public PersonPrivacySettingsBuilder(ReadOnlyPerson person) { + pps = new PersonPrivacySettings(); + pps.setNameIsPrivate(person.getName().isPrivate()); + pps.setPhoneIsPrivate(person.getPhone().isPrivate()); + pps.setEmailIsPrivate(person.getEmail().isPrivate()); + pps.setAddressIsPrivate(person.getAddress().isPrivate()); + } + + /** + * Sets the {@code nameIsPrivate} of the {@code PersonPrivacySettings} that we are building. + */ + public PersonPrivacySettingsBuilder setNamePrivate(String name) { + if (name.equals("Optional[true]") || name.equals("true")) { + pps.setNameIsPrivate(true); + } else if (name.equals("Optional[false]") || name.equals("false")) { + pps.setNameIsPrivate(false); + } else { + throw new IllegalArgumentException("Privacy of name should be true or false"); + } + return this; + } + + /** + * Sets the {@code phoneIsPrivate} of the {@code PersonPrivacySettings} that we are building. + */ + public PersonPrivacySettingsBuilder setPhonePrivate(String phone) { + if (phone.equals("Optional[true]") || phone.equals("true")) { + pps.setPhoneIsPrivate(true); + } else if (phone.equals("Optional[false]") || phone.equals("false")) { + pps.setPhoneIsPrivate(false); + } else { + throw new IllegalArgumentException("Privacy of phone should be true or false"); + } + return this; + } + + /** + * Sets the {@code emailIsPrivate} of the {@code PersonPrivacySettings} that we are building. + */ + public PersonPrivacySettingsBuilder setEmailPrivate(String email) { + if (email.equals("Optional[true]") || email.equals("true")) { + pps.setEmailIsPrivate(true); + } else if (email.equals("Optional[false]") || email.equals("false")) { + pps.setEmailIsPrivate(false); + } else { + throw new IllegalArgumentException("Privacy of email should be true or false"); + } + return this; + } + + /** + * Sets the {@code addressIsPrivate} of the {@code PersonPrivacySettings} that we are building. + */ + public PersonPrivacySettingsBuilder setAddressPrivate(String address) { + if (address.equals("Optional[true]") || address.equals("true")) { + pps.setAddressIsPrivate(true); + } else if (address.equals("Optional[false]") || address.equals("false")) { + pps.setAddressIsPrivate(false); + } else { + throw new IllegalArgumentException("Privacy of address should be true or false"); + } + return this; + } + + public PersonPrivacySettings build() { + return pps; + } +} From cfc3d11d6d9b00d53c386747402540f207e7dae3 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 00:37:21 +0800 Subject: [PATCH 14/34] Modify PersonPrivacySettings --- .../logic/commands/ChangePrivacyCommand.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index 2e438cb0ca51..a61b8ae55b92 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -121,14 +121,31 @@ private static Person createPersonWithChangedPrivacy(ReadOnlyPerson person, Pers return new Person(n, p, e, a, t); } + public Index getIndex() { + return index; + } + + public PersonPrivacySettings getPps() { + return pps; + } + /** * Stores the privacy settings for each field of a person. */ public static class PersonPrivacySettings { - private Boolean nameIsPrivate; - private Boolean phoneIsPrivate; - private Boolean emailIsPrivate; - private Boolean addressIsPrivate; + private Boolean nameIsPrivate = false; + private Boolean phoneIsPrivate = false; + private Boolean emailIsPrivate = false; + private Boolean addressIsPrivate = false; + + public PersonPrivacySettings() {} + + public PersonPrivacySettings(PersonPrivacySettings toCopy) { + this.nameIsPrivate = toCopy.nameIsPrivate; + this.phoneIsPrivate = toCopy.phoneIsPrivate; + this.emailIsPrivate = toCopy.emailIsPrivate; + this.addressIsPrivate = toCopy.addressIsPrivate; + } /** * Returns true if at least one field is not null. From 931b525571bf4e2dc8b6b8fc91cccd569cc05a89 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 00:37:50 +0800 Subject: [PATCH 15/34] Add tests for ChangePrivacyCommand in AddressBookParserTest --- .../logic/parser/AddressBookParserTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index 9688d6d3b312..cd6b4ab300f7 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -5,6 +5,7 @@ import static org.junit.Assert.fail; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; +import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; import java.util.Arrays; @@ -17,6 +18,8 @@ import seedu.address.logic.commands.AddCommand; import seedu.address.logic.commands.BackupCommand; +import seedu.address.logic.commands.ChangePrivacyCommand; +import seedu.address.logic.commands.ChangePrivacyCommand.PersonPrivacySettings; import seedu.address.logic.commands.ClearCommand; import seedu.address.logic.commands.DeleteCommand; import seedu.address.logic.commands.EditCommand; @@ -34,6 +37,7 @@ import seedu.address.model.person.Person; import seedu.address.testutil.EditPersonDescriptorBuilder; import seedu.address.testutil.PersonBuilder; +import seedu.address.testutil.PersonPrivacySettingsBuilder; import seedu.address.testutil.PersonUtil; public class AddressBookParserTest { @@ -57,6 +61,37 @@ public void parseCommandAliasAdd() throws Exception { assertEquals(new AddCommand(person), command); } + @Test + public void parseCommandChangePrivacy() throws Exception { + Person person = new PersonBuilder().build(); + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder(person).build(); + + ChangePrivacyCommand command = (ChangePrivacyCommand) parser.parseCommand( + ChangePrivacyCommand.COMMAND_WORD + " " + INDEX_FIRST_PERSON.getOneBased() + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); + ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); + + assertEquals(command.getIndex(), actualCommand.getIndex()); + assertEquals(command.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); + assertEquals(command.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); + assertEquals(command.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); + assertEquals(command.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + } + + @Test + public void parseCommandAliasChangePrivacy() throws Exception { + Person person = new PersonBuilder().build(); + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder(person).build(); + + ChangePrivacyCommand command = (ChangePrivacyCommand) parser.parseCommand( + ChangePrivacyCommand.COMMAND_ALIAS + " " + INDEX_FIRST_PERSON.getOneBased() + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); + ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); + + assertEquals(command.getIndex(), actualCommand.getIndex()); + assertEquals(command.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); + assertEquals(command.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); + assertEquals(command.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); + assertEquals(command.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + } @Test public void parseCommandClear() throws Exception { From 947d2aeb9429f7e20846e13f55838986d251ffbd Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 00:40:41 +0800 Subject: [PATCH 16/34] Update User Guide to clarify when there are missing prefixes --- docs/UserGuide.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/UserGuide.adoc b/docs/UserGuide.adoc index 9a73079ba271..840d2b412b88 100644 --- a/docs/UserGuide.adoc +++ b/docs/UserGuide.adoc @@ -147,6 +147,7 @@ Shorthand commands: `cp` * Fields with an input of `show` will set the privacy of that field for that person to be public. The data in that field will be visible in the UI. * Fields with an input of `hide` will set the privacy of that field for that person to be private. The data in that field will remain stored but not be visible in the UI. * Details that do not originally contain any data will still remain empty after changing their privacy +* If you dot no add a prefix for the field in the command, that field will default to be public. **** Examples: From 7374ee8157292370d64abfe6c2d79f551c00339c Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 01:02:45 +0800 Subject: [PATCH 17/34] Add success test cases in ChangePrivacyCommandParserTest --- .../ChangePrivacyCommandParserTest.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java index fb2be647e948..6c32617dd61f 100644 --- a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java @@ -1,5 +1,6 @@ package seedu.address.logic.parser; +import static org.junit.Assert.assertEquals; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; @@ -8,10 +9,18 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; +import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; +import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON; +import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON; import org.junit.Test; +import seedu.address.commons.core.index.Index; import seedu.address.logic.commands.ChangePrivacyCommand; +import seedu.address.logic.commands.ChangePrivacyCommand.PersonPrivacySettings; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.testutil.PersonPrivacySettingsBuilder; public class ChangePrivacyCommandParserTest { @@ -70,4 +79,98 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, "1" + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_ADDRESS + "notBoolean", String.format(MESSAGE_INVALID_COMMAND_FORMAT, ChangePrivacyCommand.MESSAGE_USAGE)); } + + + @Test + public void parse_allFieldsSpecified_success() throws ParseException { + Index targetIndex = INDEX_SECOND_PERSON; + String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "false" + + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_PHONE + "false"; + + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). + setEmailPrivate("false").setAddressPrivate("true").setPhonePrivate("false").build(); + ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); + + ChangePrivacyCommand actualCommand = parser.parse(userInput); + + assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); + assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); + assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); + assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); + assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + } + + @Test + public void parse_someFieldsSpecified_success() throws ParseException { + Index targetIndex = INDEX_FIRST_PERSON; + String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "true"; + + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). + setEmailPrivate("true").setAddressPrivate("false").setPhonePrivate("false").build(); + ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); + + ChangePrivacyCommand actualCommand = parser.parse(userInput); + + assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); + assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); + assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); + assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); + assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + } + + @Test + public void parse_oneFieldSpecified_success() throws ParseException { + Index targetIndex = INDEX_THIRD_PERSON; + String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true"; + + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). + setEmailPrivate("false").setAddressPrivate("false").setPhonePrivate("false").build(); + ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); + + ChangePrivacyCommand actualCommand = parser.parse(userInput); + + assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); + assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); + assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); + assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); + assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + } + + @Test + public void parse_multipleRepeatedFields_acceptsLast() throws ParseException { + Index targetIndex = INDEX_THIRD_PERSON; + String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "false" + + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_PHONE + "false" + " " + PREFIX_NAME + "false" + " " + + PREFIX_EMAIL + "true" + " " + PREFIX_ADDRESS + "false" + " " + PREFIX_PHONE + "true"; + + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("false"). + setEmailPrivate("true").setAddressPrivate("false").setPhonePrivate("true").build(); + ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); + + ChangePrivacyCommand actualCommand = parser.parse(userInput); + + assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); + assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); + assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); + assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); + assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + } + + @Test + public void parse_invalidValueFollowedByValidValue_success() throws ParseException { + Index targetIndex = INDEX_THIRD_PERSON; + String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "notBoolean" + " " + PREFIX_NAME + "true"; + + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). + setEmailPrivate("false").setAddressPrivate("false").setPhonePrivate("false").build(); + ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); + + ChangePrivacyCommand actualCommand = parser.parse(userInput); + + assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); + assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); + assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); + assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); + assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + } } From b6ce1a177ccdaedf4462001fb3b3f8bddc67e875 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 01:13:42 +0800 Subject: [PATCH 18/34] Fix checkstyle --- .../ChangePrivacyCommandParserTest.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java index 6c32617dd61f..e66e6e779f48 100644 --- a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java @@ -9,7 +9,6 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; -import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON; import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON; @@ -84,11 +83,11 @@ public void parse_invalidValue_failure() { @Test public void parse_allFieldsSpecified_success() throws ParseException { Index targetIndex = INDEX_SECOND_PERSON; - String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "false" + - " " + PREFIX_ADDRESS + "true" + " " + PREFIX_PHONE + "false"; + String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "false" + + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_PHONE + "false"; - PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). - setEmailPrivate("false").setAddressPrivate("true").setPhonePrivate("false").build(); + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true") + .setEmailPrivate("false").setAddressPrivate("true").setPhonePrivate("false").build(); ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); ChangePrivacyCommand actualCommand = parser.parse(userInput); @@ -105,8 +104,8 @@ public void parse_someFieldsSpecified_success() throws ParseException { Index targetIndex = INDEX_FIRST_PERSON; String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "true"; - PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). - setEmailPrivate("true").setAddressPrivate("false").setPhonePrivate("false").build(); + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true") + .setEmailPrivate("true").setAddressPrivate("false").setPhonePrivate("false").build(); ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); ChangePrivacyCommand actualCommand = parser.parse(userInput); @@ -123,8 +122,8 @@ public void parse_oneFieldSpecified_success() throws ParseException { Index targetIndex = INDEX_THIRD_PERSON; String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true"; - PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). - setEmailPrivate("false").setAddressPrivate("false").setPhonePrivate("false").build(); + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true") + .setEmailPrivate("false").setAddressPrivate("false").setPhonePrivate("false").build(); ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); ChangePrivacyCommand actualCommand = parser.parse(userInput); @@ -139,12 +138,12 @@ public void parse_oneFieldSpecified_success() throws ParseException { @Test public void parse_multipleRepeatedFields_acceptsLast() throws ParseException { Index targetIndex = INDEX_THIRD_PERSON; - String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "false" + - " " + PREFIX_ADDRESS + "true" + " " + PREFIX_PHONE + "false" + " " + PREFIX_NAME + "false" + " " + - PREFIX_EMAIL + "true" + " " + PREFIX_ADDRESS + "false" + " " + PREFIX_PHONE + "true"; + String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "true" + " " + PREFIX_EMAIL + "false" + + " " + PREFIX_ADDRESS + "true" + " " + PREFIX_PHONE + "false" + " " + PREFIX_NAME + "false" + " " + + PREFIX_EMAIL + "true" + " " + PREFIX_ADDRESS + "false" + " " + PREFIX_PHONE + "true"; - PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("false"). - setEmailPrivate("true").setAddressPrivate("false").setPhonePrivate("true").build(); + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("false") + .setEmailPrivate("true").setAddressPrivate("false").setPhonePrivate("true").build(); ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); ChangePrivacyCommand actualCommand = parser.parse(userInput); @@ -161,8 +160,8 @@ public void parse_invalidValueFollowedByValidValue_success() throws ParseExcepti Index targetIndex = INDEX_THIRD_PERSON; String userInput = targetIndex.getOneBased() + " " + PREFIX_NAME + "notBoolean" + " " + PREFIX_NAME + "true"; - PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true"). - setEmailPrivate("false").setAddressPrivate("false").setPhonePrivate("false").build(); + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder().setNamePrivate("true") + .setEmailPrivate("false").setAddressPrivate("false").setPhonePrivate("false").build(); ChangePrivacyCommand expectedCommand = new ChangePrivacyCommand(targetIndex, pps); ChangePrivacyCommand actualCommand = parser.parse(userInput); From 9af5511c17f741ba18cdba39aba27e712d082cd9 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 01:19:46 +0800 Subject: [PATCH 19/34] Fix checkstyle --- .../seedu/address/logic/parser/AddressBookParserTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index cd6b4ab300f7..b580cbc8683e 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -67,7 +67,8 @@ public void parseCommandChangePrivacy() throws Exception { PersonPrivacySettings pps = new PersonPrivacySettingsBuilder(person).build(); ChangePrivacyCommand command = (ChangePrivacyCommand) parser.parseCommand( - ChangePrivacyCommand.COMMAND_WORD + " " + INDEX_FIRST_PERSON.getOneBased() + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); + ChangePrivacyCommand.COMMAND_WORD + " " + INDEX_FIRST_PERSON.getOneBased() + + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); assertEquals(command.getIndex(), actualCommand.getIndex()); @@ -83,7 +84,8 @@ public void parseCommandAliasChangePrivacy() throws Exception { PersonPrivacySettings pps = new PersonPrivacySettingsBuilder(person).build(); ChangePrivacyCommand command = (ChangePrivacyCommand) parser.parseCommand( - ChangePrivacyCommand.COMMAND_ALIAS + " " + INDEX_FIRST_PERSON.getOneBased() + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); + ChangePrivacyCommand.COMMAND_ALIAS + " " + INDEX_FIRST_PERSON.getOneBased() + + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); assertEquals(command.getIndex(), actualCommand.getIndex()); From e96fabe6813c3b008bebf831f6684d397a96ad43 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 01:58:55 +0800 Subject: [PATCH 20/34] Rename getter methods for PersonPrivacySettings --- .../logic/commands/ChangePrivacyCommand.java | 60 ++++++++++++++----- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index a61b8ae55b92..0206254597b8 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -103,19 +103,19 @@ private static Person createPersonWithChangedPrivacy(ReadOnlyPerson person, Pers Address a = person.getAddress(); Set t = person.getTags(); - if (pps.nameIsPrivate() != null) { - n.setPrivate(pps.nameIsPrivate()); + if (pps.getNameIsPrivate() != null) { + n.setPrivate(pps.getNameIsPrivate()); } - if (pps.phoneIsPrivate() != null) { - p.setPrivate(pps.phoneIsPrivate()); + if (pps.getPhoneIsPrivate() != null) { + p.setPrivate(pps.getPhoneIsPrivate()); } - if (pps.emailIsPrivate() != null) { - e.setPrivate(pps.emailIsPrivate()); + if (pps.getEmailIsPrivate() != null) { + e.setPrivate(pps.getEmailIsPrivate()); } - if (pps.addressIsPrivate() != null) { - a.setPrivate(pps.addressIsPrivate()); + if (pps.getAddressIsPrivate() != null) { + a.setPrivate(pps.getAddressIsPrivate()); } return new Person(n, p, e, a, t); @@ -133,10 +133,10 @@ public PersonPrivacySettings getPps() { * Stores the privacy settings for each field of a person. */ public static class PersonPrivacySettings { - private Boolean nameIsPrivate = false; - private Boolean phoneIsPrivate = false; - private Boolean emailIsPrivate = false; - private Boolean addressIsPrivate = false; + private Boolean nameIsPrivate; + private Boolean phoneIsPrivate; + private Boolean emailIsPrivate; + private Boolean addressIsPrivate; public PersonPrivacySettings() {} @@ -155,7 +155,14 @@ public boolean isAnyFieldNonNull() { this.emailIsPrivate, this.addressIsPrivate); } - public Boolean nameIsPrivate() { + /** + * Returns the value of nameIsPrivate, returns false if null + * @return the value of nameIsPrivate + */ + public Boolean getNameIsPrivate() { + if (nameIsPrivate == null) { + return false; + } return nameIsPrivate; } @@ -164,7 +171,14 @@ public void setNameIsPrivate(boolean nameIsPrivate) { this.nameIsPrivate = nameIsPrivate; } - public Boolean phoneIsPrivate() { + /** + * Returns the value of phoneIsPrivate, returns false if null + * @return the value of phoneIsPrivate + */ + public Boolean getPhoneIsPrivate() { + if (phoneIsPrivate == null) { + return false; + } return phoneIsPrivate; } @@ -173,7 +187,14 @@ public void setPhoneIsPrivate(boolean phoneIsPrivate) { this.phoneIsPrivate = phoneIsPrivate; } - public Boolean emailIsPrivate() { + /** + * Returns the value of emailIsPrivate, returns false if null + * @return the value of emailIsPrivate + */ + public Boolean getEmailIsPrivate() { + if (emailIsPrivate == null) { + return false; + } return emailIsPrivate; } @@ -182,7 +203,14 @@ public void setEmailIsPrivate(boolean emailIsPrivate) { this.emailIsPrivate = emailIsPrivate; } - public Boolean addressIsPrivate() { + /** + * Returns the value of addressIsPrivate, returns false if null + * @return the value of addressIsPrivate + */ + public Boolean getAddressIsPrivate() { + if (addressIsPrivate == null) { + return false; + } return addressIsPrivate; } From 6eaccb0d1e468db952c34bd8aeaff76251f8475b Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Mon, 23 Oct 2017 01:59:31 +0800 Subject: [PATCH 21/34] Modify tests to follow new getter method --- .../commands/ChangePrivacyCommandTest.java | 19 +++++++++ .../logic/parser/AddressBookParserTest.java | 16 ++++---- .../ChangePrivacyCommandParserTest.java | 40 +++++++++---------- 3 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java diff --git a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java new file mode 100644 index 000000000000..b0d25a830abe --- /dev/null +++ b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java @@ -0,0 +1,19 @@ +package seedu.address.logic.commands; + +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + +import org.junit.Test; + +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; + +public class ChangePrivacyCommandTest { + + private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + + @Test + public void personPrivacySettingsTests() { + + } +} diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index b580cbc8683e..b428e1476626 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -72,10 +72,10 @@ public void parseCommandChangePrivacy() throws Exception { ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); assertEquals(command.getIndex(), actualCommand.getIndex()); - assertEquals(command.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); - assertEquals(command.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); - assertEquals(command.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); - assertEquals(command.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + assertEquals(command.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(command.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(command.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(command.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); } @Test @@ -89,10 +89,10 @@ public void parseCommandAliasChangePrivacy() throws Exception { ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); assertEquals(command.getIndex(), actualCommand.getIndex()); - assertEquals(command.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); - assertEquals(command.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); - assertEquals(command.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); - assertEquals(command.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + assertEquals(command.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(command.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(command.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(command.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); } @Test diff --git a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java index e66e6e779f48..65fc0d07ab1c 100644 --- a/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/ChangePrivacyCommandParserTest.java @@ -93,10 +93,10 @@ public void parse_allFieldsSpecified_success() throws ParseException { ChangePrivacyCommand actualCommand = parser.parse(userInput); assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); - assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); - assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); - assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); - assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + assertEquals(expectedCommand.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(expectedCommand.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(expectedCommand.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(expectedCommand.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); } @Test @@ -111,10 +111,10 @@ public void parse_someFieldsSpecified_success() throws ParseException { ChangePrivacyCommand actualCommand = parser.parse(userInput); assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); - assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); - assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); - assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); - assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + assertEquals(expectedCommand.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(expectedCommand.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(expectedCommand.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(expectedCommand.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); } @Test @@ -129,10 +129,10 @@ public void parse_oneFieldSpecified_success() throws ParseException { ChangePrivacyCommand actualCommand = parser.parse(userInput); assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); - assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); - assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); - assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); - assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + assertEquals(expectedCommand.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(expectedCommand.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(expectedCommand.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(expectedCommand.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); } @Test @@ -149,10 +149,10 @@ public void parse_multipleRepeatedFields_acceptsLast() throws ParseException { ChangePrivacyCommand actualCommand = parser.parse(userInput); assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); - assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); - assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); - assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); - assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + assertEquals(expectedCommand.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(expectedCommand.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(expectedCommand.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(expectedCommand.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); } @Test @@ -167,9 +167,9 @@ public void parse_invalidValueFollowedByValidValue_success() throws ParseExcepti ChangePrivacyCommand actualCommand = parser.parse(userInput); assertEquals(expectedCommand.getIndex(), actualCommand.getIndex()); - assertEquals(expectedCommand.getPps().addressIsPrivate(), actualCommand.getPps().addressIsPrivate()); - assertEquals(expectedCommand.getPps().nameIsPrivate(), actualCommand.getPps().nameIsPrivate()); - assertEquals(expectedCommand.getPps().emailIsPrivate(), actualCommand.getPps().emailIsPrivate()); - assertEquals(expectedCommand.getPps().phoneIsPrivate(), actualCommand.getPps().phoneIsPrivate()); + assertEquals(expectedCommand.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(expectedCommand.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(expectedCommand.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(expectedCommand.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); } } From f8e4d48ff13f5b2db305ad9516b791e888aed1d1 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 06:03:03 +0800 Subject: [PATCH 22/34] Add test cases in ChangePrivacyCommandTestPrivacyCommandTest.java --- .../commands/ChangePrivacyCommandTest.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java index b0d25a830abe..2b6d5f3e6f32 100644 --- a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java @@ -1,12 +1,23 @@ package seedu.address.logic.commands; +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertFalse; +import static seedu.address.logic.commands.ChangePrivacyCommand.*; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; import org.junit.Test; +import seedu.address.commons.core.index.Index; +import seedu.address.model.AddressBook; import seedu.address.model.Model; import seedu.address.model.ModelManager; import seedu.address.model.UserPrefs; +import seedu.address.model.person.Person; +import seedu.address.model.person.ReadOnlyPerson; +import seedu.address.testutil.PersonBuilder; +import seedu.address.testutil.PersonPrivacySettingsBuilder; public class ChangePrivacyCommandTest { @@ -14,6 +25,65 @@ public class ChangePrivacyCommandTest { @Test public void personPrivacySettingsTests() { + PersonPrivacySettings pps = new PersonPrivacySettings(); + assertFalse(pps.isAnyFieldNonNull()); + + PersonPrivacySettings ppsByBuilder = new PersonPrivacySettingsBuilder().setNamePrivate("true") + .setPhonePrivate("false").setEmailPrivate("true").setAddressPrivate("true").build(); + + pps.setNameIsPrivate(true); + pps.setPhoneIsPrivate(false); + pps.setEmailIsPrivate(true); + pps.setAddressIsPrivate(true); + + assertEquals(ppsByBuilder.getAddressIsPrivate(), pps.getAddressIsPrivate()); + assertEquals(ppsByBuilder.getEmailIsPrivate(), pps.getEmailIsPrivate()); + assertEquals(ppsByBuilder.getNameIsPrivate(), pps.getNameIsPrivate()); + assertEquals(ppsByBuilder.getPhoneIsPrivate(), pps.getPhoneIsPrivate()); + assertEquals(ppsByBuilder.isAnyFieldNonNull(), pps.isAnyFieldNonNull()); + } + + @Test + public void execute_allFieldsSpecifiedUnfilteredList_success() throws Exception { + Person newPerson = new PersonBuilder().withEmail("alice@example.com").build(); + newPerson.getEmail().setPrivate(true); + + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder(newPerson).setNamePrivate("false") + .setPhonePrivate("false").setEmailPrivate("true").setAddressPrivate("false").build(); + ChangePrivacyCommand changePrivacyCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); + changePrivacyCommand.model = model; + + String expectedMessage = String.format(ChangePrivacyCommand.MESSAGE_CHANGE_PRIVACY_SUCCESS, newPerson); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + + expectedModel.updatePerson(model.getFilteredPersonList().get(0), newPerson); + + assertCommandSuccess(changePrivacyCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_someFieldsSpecifiedUnfilteredList_success() throws Exception { + Index indexLastPerson = Index.fromOneBased(model.getFilteredPersonList().size()); + ReadOnlyPerson lastPerson = model.getFilteredPersonList().get(indexLastPerson.getZeroBased()); + + Person personInList = new PersonBuilder(lastPerson).build(); + personInList.getName().setPrivate(true); + personInList.getPhone().setPrivate(true); + + PersonPrivacySettings pps = new PersonPrivacySettingsBuilder(personInList).setNamePrivate("true") + .setPhonePrivate("true").build(); + ChangePrivacyCommand changePrivacyCommand = new ChangePrivacyCommand(indexLastPerson, pps); + changePrivacyCommand.model = model; + + String expectedMessage = String.format(ChangePrivacyCommand.MESSAGE_CHANGE_PRIVACY_SUCCESS, personInList); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + + expectedModel.updatePerson(lastPerson, personInList); + + + assertCommandSuccess(changePrivacyCommand, model, expectedMessage, expectedModel); } } From 6260b88a7f3f20cd9a0ace4522c782152927aa6b Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 06:05:00 +0800 Subject: [PATCH 23/34] Update SortCommand and SortCommandParserTest --- .../address/logic/commands/SortCommand.java | 4 +- .../logic/parser/SortCommandParserTest.java | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/SortCommand.java b/src/main/java/seedu/address/logic/commands/SortCommand.java index bfa05b4ca6c4..64ff2c9c8bd3 100644 --- a/src/main/java/seedu/address/logic/commands/SortCommand.java +++ b/src/main/java/seedu/address/logic/commands/SortCommand.java @@ -38,11 +38,11 @@ public SortCommand(String field, String order) { this.order = order; } - private String getField() { + public String getField() { return this.field; } - private String getOrder() { + public String getOrder() { return this.order; } diff --git a/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java b/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java index 7e5aa8c70ce4..8e61538a8c0a 100644 --- a/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java @@ -1,5 +1,6 @@ package seedu.address.logic.parser; +import static org.junit.Assert.assertEquals; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.commands.SortCommand.MESSAGE_INVALID_INPUT; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; @@ -7,6 +8,7 @@ import org.junit.Test; import seedu.address.logic.commands.SortCommand; +import seedu.address.logic.parser.exceptions.ParseException; public class SortCommandParserTest { @@ -34,4 +36,58 @@ public void parse_wrongArguments_failure() { } + + @Test + public void parse_validArguments_success() throws ParseException { + SortCommand expectedCommand; + SortCommand actualCommand; + + expectedCommand = new SortCommand("name", "asc"); + actualCommand = parser.parse("name asc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + + expectedCommand = new SortCommand("name", "desc"); + actualCommand = parser.parse("name desc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + + expectedCommand = new SortCommand("phone", "asc"); + actualCommand = parser.parse("phone asc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + + expectedCommand = new SortCommand("phone", "desc"); + actualCommand = parser.parse("phone desc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + + expectedCommand = new SortCommand("email", "asc"); + actualCommand = parser.parse("email asc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + + expectedCommand = new SortCommand("email", "desc"); + actualCommand = parser.parse("email desc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + + expectedCommand = new SortCommand("address", "asc"); + actualCommand = parser.parse("address asc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + + expectedCommand = new SortCommand("address", "desc"); + actualCommand = parser.parse("address desc"); + + assertEquals(expectedCommand.getField(), actualCommand.getField()); + assertEquals(expectedCommand.getOrder(), actualCommand.getOrder()); + } } From 7fe738a431e0057ff305fec7aa6f30406e2d1a4c Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 06:11:39 +0800 Subject: [PATCH 24/34] Fix checkstyle --- .../commands/ChangePrivacyCommandTest.java | 4 ++-- .../logic/parser/SortCommandParserTest.java | 21 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java index 2b6d5f3e6f32..eeb8d790a1be 100644 --- a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java @@ -2,7 +2,7 @@ import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertFalse; -import static seedu.address.logic.commands.ChangePrivacyCommand.*; +import static seedu.address.logic.commands.ChangePrivacyCommand.PersonPrivacySettings; import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; @@ -30,7 +30,7 @@ public void personPrivacySettingsTests() { assertFalse(pps.isAnyFieldNonNull()); PersonPrivacySettings ppsByBuilder = new PersonPrivacySettingsBuilder().setNamePrivate("true") - .setPhonePrivate("false").setEmailPrivate("true").setAddressPrivate("true").build(); + .setPhonePrivate("false").setEmailPrivate("true").setAddressPrivate("true").build(); pps.setNameIsPrivate(true); pps.setPhoneIsPrivate(false); diff --git a/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java b/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java index 8e61538a8c0a..9fb845febd12 100644 --- a/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java @@ -22,17 +22,24 @@ public void no_arguments_throwsParseException() { @Test public void parse_wrongArguments_failure() { // no field specified - assertParseFailure(parser, "asc", String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); - assertParseFailure(parser, "desc", String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "asc", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "desc", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); // no order specified - assertParseFailure(parser, "name", String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); - assertParseFailure(parser, "phone", String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); - assertParseFailure(parser, "email", String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); - assertParseFailure(parser, "address", String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "name", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "phone", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "email", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "address", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE)); // no field or order - assertParseFailure(parser, "random text", String.format(MESSAGE_INVALID_INPUT, SortCommand.MESSAGE_USAGE)); + assertParseFailure(parser, "random text", + String.format(MESSAGE_INVALID_INPUT, SortCommand.MESSAGE_USAGE)); } From 651c7905d5a4249037766a17fcaa8229342eedf9 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 06:29:45 +0800 Subject: [PATCH 25/34] Update AddressBookParserTest --- .../commands/ChangePrivacyCommandTest.java | 1 - .../logic/parser/AddressBookParserTest.java | 27 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java index eeb8d790a1be..25e7dfeda632 100644 --- a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java @@ -83,7 +83,6 @@ public void execute_someFieldsSpecifiedUnfilteredList_success() throws Exception expectedModel.updatePerson(lastPerson, personInList); - assertCommandSuccess(changePrivacyCommand, model, expectedMessage, expectedModel); } } diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index b428e1476626..1d28f25068fb 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -71,11 +71,7 @@ public void parseCommandChangePrivacy() throws Exception { + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); - assertEquals(command.getIndex(), actualCommand.getIndex()); - assertEquals(command.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); - assertEquals(command.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); - assertEquals(command.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); - assertEquals(command.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); + assertTrue(changePrivacyCommandsEqual(command, actualCommand)); } @Test @@ -88,11 +84,7 @@ public void parseCommandAliasChangePrivacy() throws Exception { + " " + PREFIX_NAME + String.valueOf(person.getName().isPrivate())); ChangePrivacyCommand actualCommand = new ChangePrivacyCommand(INDEX_FIRST_PERSON, pps); - assertEquals(command.getIndex(), actualCommand.getIndex()); - assertEquals(command.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); - assertEquals(command.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); - assertEquals(command.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); - assertEquals(command.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); + assertTrue(changePrivacyCommandsEqual(command, actualCommand)); } @Test @@ -264,4 +256,19 @@ public void parseCommandUnknownCommandThrowsParseException() throws Exception { thrown.expectMessage(MESSAGE_UNKNOWN_COMMAND); parser.parseCommand("unknownCommand"); } + + /** + * Checks if 2 ChangePrivacyCommands are equal + * @param command the expected command + * @param actualCommand the actual command + * @return true if all the data are equal + */ + private boolean changePrivacyCommandsEqual(ChangePrivacyCommand command, ChangePrivacyCommand actualCommand) { + assertEquals(command.getIndex(), actualCommand.getIndex()); + assertEquals(command.getPps().getAddressIsPrivate(), actualCommand.getPps().getAddressIsPrivate()); + assertEquals(command.getPps().getNameIsPrivate(), actualCommand.getPps().getNameIsPrivate()); + assertEquals(command.getPps().getEmailIsPrivate(), actualCommand.getPps().getEmailIsPrivate()); + assertEquals(command.getPps().getPhoneIsPrivate(), actualCommand.getPps().getPhoneIsPrivate()); + return true; + } } From fd70c8b40963f928184de7a2246178eb6498b60e Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 07:05:05 +0800 Subject: [PATCH 26/34] Update UserGuide --- docs/UserGuide.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/UserGuide.adoc b/docs/UserGuide.adoc index 9ce5fdd17272..ddb309aecb65 100644 --- a/docs/UserGuide.adoc +++ b/docs/UserGuide.adoc @@ -182,8 +182,8 @@ Changes the tag called `friends` to one called `enemies` instead. All existing c === Changing the Privacy of a person's details : `changeprivacy` `cp` (Since V1.3) -You can use the `changeprivacy` command to set the privacy settings for each field of an existing `Person` in the address book, which allows you to choose specifically, what information will be displayed. + -Format: `changeprivacy INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [b/BIRTHDAY] [t/TAG]` +You can use the `changeprivacy` command to set the privacy settings for each field of an existing `Person` in the address book, which allows you to choose specifically what information will be displayed. + +Format: `changeprivacy INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS]` Shorthand commands: `cp` **** @@ -200,8 +200,8 @@ Examples: * `changeprivacy 1 p/false e/true` + Sets the phone number of the 1st person to be public and their email address to be private. The 1st person's phone number will be displayed, if available, while their email address will be hidden in the UI. -* `cp 2 a/false n/true t/false` + -Sets the address and tags of the 2nd person to be public and their name to be private. The 2nd person's address and tags will be displayed, if available, while their name will be hidden in the UI. +* `cp 2 a/false n/true e/false` + +Sets the address and email of the 2nd person to be public and their name to be private. The 2nd person's address and email will be displayed, if available, while their name will be hidden in the UI. === Locating persons by name : `find` From 57c69b052730333361ddc4ed0b64909f961b0a5e Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 21:07:08 +0800 Subject: [PATCH 27/34] Update AddPrivateSequenceDiagram --- docs/diagrams/AddPrivateSequenceDiagram.pptx | Bin 44186 -> 44290 bytes docs/images/AddPrivateSequenceDiagram.png | Bin 53495 -> 50176 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/diagrams/AddPrivateSequenceDiagram.pptx b/docs/diagrams/AddPrivateSequenceDiagram.pptx index 7345150e91b2d8c46a7cf153ba468e52420e3bf1..1be31191d4597dadda144df0f7948044001103f3 100644 GIT binary patch delta 10574 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 delta 10671 zcmZX41ymi&wk_=71b26LmjJ=tB?Na1?#{-81=~n)cXubay99T4cl(^Y`_Fmzyc#{a zt9#Cp(W|P~tToDi5sP=VSv3q?VOk#tt^a99RKIR!supg zb*!^wv(<;w&NShQ>=X}BW8Vvik^45Nj7ywC|2t*Xkz(==M4W*^+W@dmug*h@LHNmM$cl${GF_nH2#7vKYAiZC1WLeXnKc)K*< zMSfZJKT)xyj_nT8WW6q7CW~Jz^-0baHh--+BK%@1P$xII9J0N z-7Ja4G6wv3Ox8u*vpAQ!X^sen0prw$3U54HEI_iz(AK6m-Oyld(G9-nbBPUBs#GG= z(_{E@RN62r;-Ll1+t742(meZkpmk$hb7fxsd9DP>0{bxMe)q}Ax!of%IRn`2o_LGt z$f5V5i%&mWd;R?s+BN9`ckO3@LD7SW3wG+VZm!HrQF@u{Q+@^ITg~gInZ2$hIa^bO zv3fHz_0MNbE-oAkjyKFLot1VfFRCtfv;8O!SFK29hk1HHaf7JI=Y?B=`TDuGsGdUN zu8$ZbLV3&HoG>`xarU3gLvtVDT!RTyOQ&vjpO`gnuRBwGlC}FC`CHpxSsEYg+a{qC z9l0*`U&npU3~^|ZTVb;aDg7G}SL(X06Pq`9Lou%oNW(_3%u1-fZgHWGu+H8yuj-n6kmIj%|W(2t|g7ss?p%+>a`CT%=( zqa%s&uSVu+CUU;Y@h`Q+}LI!*a<>nX4`re zWEejnNfs0=b!TiPDk`!xPAn!2vq9>K@K+3I7vc_G4=%mW#*4+N3+9LX@C`;A3zTi) zp|j+-{`;(q+D=G%Y@>>Il~bn!pLI>ieg$MHNRK?Pf4b{pAKhyih54AE+Vm+?sz=ct>ta^mCHF)oYB#@5AaV4oB|9jnY#x<=t>ulsa|%e@inle0BX z(ftu47=}C+OQ9ky~chJbQdur@?3>39nqQvYM5@iTxHvH7ewF+d z1at~1)O;SnhKDCKLROJ6)Mlj)jQNq_+4(8Ngwd#6LPh&`B}%W!k0^tr7OXX?a%Vox zu>en)UwN6|VRyrl5q8i5!C6-@V2Fe)jCJH5G$)2J*qIL8rOt@S+om7*5ax~uaE2Y! zp}UV{@$o4JE8x(7_tSl(EjqHXK*mL=as=8}`l>=u-`h*pDZr3_l?lPk#}gawF#ke{wCCY(2xyWfbl9a9W!koGGuCMF48F2KXl+>U3dut%c zjB@O1^G*YVqMxsVMWwRpQ^gT6!c*J+cQ@;GeGozJLTCT8EF$hMWT|`w*P;07YyBMW zb738Kh{VCYtAqIDJo0LA&5_)_KGFOsvd7VmDSnX9@`79Ym^vX=^fi_3~QmZl>rrle7dV0#VcJ2 z0!K8D>$AoQ{hb(_jP)0`qq3kl!AR>;{(i+5rtV6B*`8%rsv_mLW8m5<=Ycgy!8m1m zmV1IV;i>=@n!({CRp350#0he27_hR*#LtM^Pf_a$N!jiK)zQ^$#ALy0P)x#9rkLC? zvP?4=d&~V$QQSn@EQgn^tIz~S1dqn!I9SG;4~c1Yq2{o#v~DSQNhUi52Gcq<$n@^M zfvC}CK9XKz>1lqe3#e~76-cO`Uu`(uKt}+&0g>i2%F>jNS2VL1Gzqk@gfxx4F1EmA zJI^m0PBZ(eLC?iuyW*KoMA~N|qr+L;Xu@FUnurNX)_vm^Tfb?Q;8XVYVpleAk8X^c5 zA|xCfgFJul)F3&4EXo_-0Y;K5U3x3%_EpgBb1Pr;7cG!EVN5J&-=0W!y`Ub25@UeCsHMcIdm~1TkU5#=zcrxfqN!5+mqW{fi=fGv5zipl}ZNy9V8en zjcZG?iX}oH(v;Cq|@Q6PTf<#m%NEbOl7G6&PyCdZg zFX>Q9em8B<@uQ+tl9+oSa|dQ`cqB0+vR#6JKT0KBB`|TXm2WPFZ>|V`u31&7p}R`z z@Rt?lWEExcQLBH;Fs8NG2$iO4Qk<``2|7+Mc3epTI0Wle3V@l^G6GMa=Aw}ePwKRM zwcO8m&fsOALvcS&gRYSTJP%C*-XCup!Wiwod1h~Mn3Ow(@l1r$MlfA`Im$M#PV2!NXIeH&n(Ux{aU>K(#DG3Ki379PS6SqY zNEFkz$ug2pNqJc`32!30*F@FQSuZ<=36w|MhQJ&$I_=)q((^ZDa7pb2ApiARWn8q} zgfSQeKS6X&6?Ozz_90SQI-G!kc5%z6vF18kDo?l;m%W+`Rmd(l9B0nlb}OtdX>-bQ z#ZtXZJ#V;JMk3XIn`6O+6ImEZ3YFu&2RFfdvn{`$%*@ysk>uDLY`so7i6&eFeuCxV ztw6>yvMdw}I9lrLhyZ%k#hRrOvj*+*_LP+#ziK?9VH*FO3$RTU9%6iXXh4xOA`3); zSy(eoTKn~3{pgZOAe!0ag?r1Y+8hm*C0z0FO&9b~uYW8X55W&8^T4D8r5(YDLTuRw zRfe1bL*ZWd;lj9*P&-rVQuPTqEK8CvT0m+(EKf$8v0h%3U3sjZ+%sx!!jyLOebQ}l zX4BwVW`@KaGz6)WRe}IHO4N(Q9lcP$=z-qfB1KIWXRo%%${kiF2xoJibv|vQHbXzs*xmhRgDw4B zFa7*3E-m|HNS>z4OtL@6q8Sq#Oq2HQ1a=MWHLK^xtmp6n2>R+2`?z*&XREK>Y8bby z0^Q2B*xjSJ)|47@EB4FChjiLs^u@r^yS6Foo(DE#G*o)>$`pV{@iTxfe>a84Bwwk% zC0->3&O5BHuq-uf7VmpPrFT%fx=z;FiW;h`X10P-UroyS*It8;W(REQ<2(%rUegFV zh6?{S^rK?MbOv1%E!hMi3WXXBt>gKzj0_=KiUR3S9BXW2I#x6t>eVmm)TTfaY1(K# zE?umE<0br7hVZXY55s8o64pOWynQjRz%_ODnSUCz!ImLST!L$^K+DXf#9-fPFZ<0V z2>RW80i}oYW4RL2>trmBWzcl7j?-4o10O(h&X15SHoOY z39dHb027KMJ+NYFc49$^Px}V+@?+IQST`>QhoD-5c-|^u8@{4nX9&1D84HlZ)-Hxz z%w4pA!b(;8T2Jx7TO$y*D|l;DqRwtzmF!8u!zO)W)Nb62HK91L)I!F(^ED=yPJH;M zW}@_`Y0}6>#so8lTCll1J~ymO7I;%uR}xpspF#tWy*6}UgUo?D`ixA#pYENfa^`1|cr`?#qQh=V0k7BySRQd>L6({xs+BAEZ7x70o3gQOod#?vhL5G#D0 zs4~E|z-@FVm!l^h0Ry>qcsdS->{Rr=jUB2;zqztGCbrSn*NjrZ*6@~ccW+3M6B4$h z_E#MhSM?MLBE`(7I=l*jl3i`uGQoXvQ@LmKt&(s6r=UN_nzudFYhAnui zAZjjmE38eO0Ew%hpD5W4luj{Qv7}md(@Z@TWrt_0vv)YZhg)SQ5?oxlvaLx(h4XH? z#|5xHDt!s#y{J738o)v$wPYZ_2Y2Dqw(VbnjpMwuXpuZ10Fng+&YKXxWF|l>v9j8Y zHAW`i%+~3)un1yN7dGlxl{&!pN=TX-)640FkeS|5-)S(co;bMKU}>)`Rl&@BZ!X(H z5k>kyQIHgL!-##Zwd`dP)2&#NTh|riO2mUYtXoUdx$@7ymVvGr2p82d* z_XfY@Dw-D+9q_Z@ILR#uA6)}H8b-85K)C6*@_>8kTV(mr^#@&ehy~=&EE?MT=b}OW&j#A%1oYotJqm3y@%M=&kGo}Hbz$(gWW9= zT-+Dt4@!>P3I3Cktn8RMoiM0*!>LjN+-a=5Kb2(%+*HWr``xk={V~XA^90kp=9Md@ z1%eJ}HG1&caKRdIe`<8cDv|_2HFO^C;jzgbnx-%lq^Quf zjm^t6B<`E3pS&`Gfq^a((LwsOtf2I4I1o1JOAUbd1Oh=U_fl`_0~i?XM=&r_5Q!pD z4IV`g035z%ohlX*!C?x8Iqe;lf&c$#IztoyoUn$GnFJixFf3Lt6#@+GHCBQQ;>so%}qI@%>rs zvb*0o-GYv?xRzd=mj`bjmu{0)D*Qq6&FeD@K&OP90W~=u67K--%K_0i@MY%%(H9K| zIj$Y$ZynUdBm@WWG!GN(C2pM#nrZQ=K#cRXQgoj9bJ|@~(tWbZtC3o$591>in)`Cz z_OdSyoH9l(8hyj57}dcr2}-ap6__*?nz)~X`yflea=y8?kaOYBT(Y<89VOFJeu);k zc2p!(s1c~=ZsA`D1*Di4C zpK^p1ACB?I8`U|SswA=euu`jgDZ6*Z0T$I}L-14oN@!qEvh1VMWAA1{nT;!XQw`NI zODBNc{GNaTA)SLJCPD&Rs zKHV(kPH1BBEC$N!i&g!WVNQ`WG4r)k84?DN*Y(@3oV-psu6fSLqM^#l40xv_Zd6ZQ z1A$xp7(!1^PmtVY-bU9>Smm|mP0@--!VMky<1Acgw5ah5-MeA!KFStr4&zmdsaZ13 z)YnxOge@3g)tR*dgsV zy@m=24PAZd4%?1|3!6n8*+oCIt6u}xj(X}dxHG_Sly#=C6{^wLA{mO6zeS!4W)ggX zb?X%M2XCGI@oY;d%xii5@_tXh_CX>^TbK>_9>}jH`F$=Rz{!mti2YX%_@0}W_eChZY#`6?JNSQ zJ)b};?IVTQx`75bQ#%Oovd(z=X2sBTn{-7P)6TU##iay`WgR)C_A1p{bfht+yJ5`L z7;_>f4e_Ymf$~uKV(Swk&nq1wM2~NjZq{EZO+rc5kRlda+qjt7XbuOS>v92_<^flr z(H$-S>9dgglMvY&c7w%HRvzkzRZs$ zox7YRc>Dz8r!{*OWBpaV@DAkl>HNXt*3;)-FZZvuKqN;s{>3ex`Eh58l(>3y8W@}? zk?}Bpmh0st>@kylJS?;k4Vbv9*4#QGg!Y}OIZFsO&Tvmwr#g->3&X`*QVh`sdJyb)s>fa)_ zhg8Vok$R^MS7l>#P~uismr~!L|61`NhQO1jYnV7w0Dz9~H6z>v;E+w_Kg^|SPI+`c z0Pixt-febXbm+r<)LllC5@`Rpqt%6aYcLo%q4fFVM*%T?%xF|f)?ekJff$eL&oYBI zdj5`@QKC;_Dr;^NC(RySyI3lUZ)b3E7@3c1b3ftkdY(8_Ai1UeXKqPtO}8doPc(u> zJa>C@EV;L)Mt&`yEs1N5`JK+6JiaUueFl2J-R{BO7F#?%QOrzn{W$b6XOLkw=EM{8 zNgnaVH{)!_?Y%X@406GQ!Y-)UW<@Cfb?90Ay}v1UclAkTa_uMo^X8a#d=vVQuZ7{- zsw+E7MZH+GmP*M_T;xWcMw~>u9sNq&aIMUzT@Y5@mgdgudy78iNza0ZEk72>;~&t< z^GypGAF7wg0z&HB-ntDQvHrLTNCkwiV*(&&0cPM5C-R$s{u!}35%k<6(?TIzk4-Da zK(qcJp>Kk@7QC1R`Uxcg)HT5^lxMj0+AXzrEP+BU!>9U`Qich7arkh7^hnpcmQS&J zd~dt?`oCktc$pqLTrzm-#oRSbc`^`=Gs^qYdg{MPxru)rJm_f8t9uz8Ow{A6c;pyv zr>XYgrf&Akoi;^X$WM!zeP%QVi!O~RvdLDzUH>o4Z<3tBD zLp6Bkv0IHDLXXr*kv}UF0uhb}N9tOr##?~N8c{RD&dwCnYGm!tUsMxkgE}yD8JHjj zAY$r!rNCd+0CvJP8|v*nLas+QNjR~uqpIkKu%}gmB7zrRyj?JUtV+^Zha4m)j{)a9 zQ^v+!>|93yE5Eacip85+cHR0?OSDEgeR&dF}-m(9ypKp1?4$!XHX7xk$=$mqH9h)Gs=X|Y-VG?ssp zs~4*2BQxBk9N@=bPRoKkaM_xGP+}kyk1JN(-inj3P_~)cftCt^1AR6wbJ15nFQbce zoQ?-kS>MA{SY#b~J7R1kUad5UOwk2YiDs)*p;5#_yzp+0-eI4^<&Y_+`7$iyK1`jg zQ-nkguNZ<7e;()R(`?mBsvu6UP{E*~$v&Kyr$WGwgaMvQy@0B&_$uMIQdeaDvO#^J zu9Qt|4jp>O;xD>jeH8H${neg?dd3Y{36X_$OZs+&lmOi?ktb{vdPaJ&aghzg58hBd z3rRdtLoVnp(VnW^PU_u{t@f1ck>sVn_?9021TPwg1dpExPqKHHfW0hYD8NsAZlHnn zv(!^)+tfmQT7dnC6&5;}3%NW{&iR%E>W$-x^mE{w*1}#>`>!E^&u}_SUdHjbqbv`> zTNI9JlE|C^0oWoYY`iZhl0#|0@=Iu8y@(TT-+`1}ZBj=@JZb!Lt||=2D{F=V z%P(D7UvhC8(0ek|sy_zo&vE1282118H0ieO>Q9dE;$e^OG$t?6R>O?j#N@wfTOSG= z!k&cXlsb;-|5|CDIUngfZm7M|7Nec%ItY z>N7SryhL@%`duQ%vJfTAim{+XIPhxt0gW#?5}#8IuOU*vNLDsaZ0 z%yr%`r(_x@GN6*pX=^nJxJQvw<=R}lTo=ZNIBCD;|8jbgq1Wd5G$&E``<{8u6oyDp zFRCN#X&&dh4{}8C;K9J>C%KjFmCOvdu*B!YBnza* z&NL{Yn1bxm;UceugrHM)r;Piz9-PO<|Hx>gO%Wgh`;me@ zZbFe%#1EIvjOQ1WS>bnUIhk7>5$2ryKEZfys)ilm_7Qee25H9w*8pzGXX<^S(`yW| z){$#xAdzk1<;eLVP-{(Bx1qOWyx7yd4YOkP*WKkKgRYL!-6a&m>OOy~K{%HWlI_f9 zZ+j2;YGdz`Cz9<{A7JYm>DSE|z{Wt1AlSM)Y9*zw=Rf={~(ijMe^Kl~?m31i9ffNoLpEO!&-5rCh)iz8I zENN8}ui7y*!fhP0vcKXNR3ac9SA=JLl0D>)w31WIZuxfeTU66>;Zw<7zB=9V_-SJ! z@g}~@M8^?Lw*#UHuJ$YogyWCbl7SQmRZ@F*l8F^?t`-`E7`E z_BZ0HV(t7Z79fp7{uq>?rUzJ(Apxng3DpEd3a^SCk+(bSAIffUm6!1r`1wljRH7ehgz-aEZfX2Z~h$8JX zdz=uw^va`mvf}B0bi~m(zI0GVFsru60gpk%IiC=a`t9M#p0sFvT2h>WT!c$-J@V$} zLa^w3TCtCT+OsMg?*(P3|3hAvf=H6pnrNh=04+6!5AKjI{1AC)`f1T#jBwGp1w)9PtT%R|-Ue#Xk3!B$`n@K&4k z;>NEZP^SAkD$o;`zfA70u3*kTv;zJNvtSUA&PvS`*fQ)>I%jPhA`V)6QXn*C! zZfY(~Uq~3kdT3AzXKuH2MH|7esZ^`&j#I=li!hD7X?LWPj@gr;-l8ORr5p9#RJX2$ zhqt$X=3+dLgPe;B7GHCYYPF#<$_T8=(6rf)WI%O``-fE{E^bK6^TULwAN zn;>Y`{^j+$2TWwjc;oNVoE3YE3)$Is^!b=$G2hyTFbHg^Dr84)A6K`ftrSQSNi(iZKAPsuNfwRIAgj90igBDJ4CwpMJiT#^y@EQ4 z-#0WOal$n%GHf5fv1-obDZt^Bdbu#+A;G`|@Ic@aq&0$y&mX{LYxq@3z~S0QjCo1l zx2JJ1f1ofmEC9H0O}07#INY>$9P>E<49pVxF9;M}1X*+bbsikxjZ`zFNe&L@c^kAc z_r7;!L;ZuVz2ijM?H_;;Ow!bDnr=S>t~+Vl`agzi?jPLaYIso$2P%_1)HAPo!mw?X zzS{)Sl-VD3Zy;k@rN?~@19m1%Hk^-Q@g&>pxGemQ@CZIGI{s%^aH1nr&d+ZCNK}$PychWQ5U$}g*dl?bCy|A!AqZ#z0NSBz z7K2=ofia=VBJSW|VEpg4K>5#U2^R|!S49U~JIB9HN<=6R+jJ8nx2hk0CO(CYOldC1 zph_%m+g7BpID@GmAjdISkO;0K)`A9QGxZyU zB3e~lmkg*}9N{_C1_+5^gcr9ct&B1>>muRKABLb&;W_T8SIctk`BU5jN59%hPG?n+ z%T1{j>i1%|#;5h}+FO~8huO>a_LG#`k-{M1kgU^G8 zQg1ksjB(US=$<~>n8d?I)Q6fwyJ-uE*US^>B}b0q`;r`W34j#3FGkJ8E07nYxvQMB z>G_D3iFeSefpuR{`OerpM2}k#?vGeB!8z5H{dvBycw^S|8WyYJz;hTM$(sMn{>+E9 z_(7TrmJ`~Z`zc-#G3kkURRpt?O!uX4nuuas%8k2`SL(Kl#z0tkvY6OV=W+dhBzb+X zFTl7~N_>8|z6$qJh@AMIu4+o!o_w8P@x|3#;z_dD9|-mKCeuUw7;?Y7@h#LO(u}Yi zTfhpB(6jKke6dNwd&QyAyhy@bz;$Wp0zre!tbTBTd)>avf0WmIT>;*pp4f8CWW!E_sH8vqPGW`7=R)^)Q@3-89>yy) z7}(p}2heRI5+pz)?nivha~dT$a8iDW89n%n>H;yLB5_^{dZlzmQD57NIBU{k`jq~u z_5yb)=7jUw=BxwnlH5@kPf(<#cFa}aZEt?|pv__e(`#aE%q~VHqC>i%R%i75u2=0A zB?mc3E!!T`)D0Ru<1)uJ-YUt7(5B6@Qvv~;0)!x2&!*i!&noO++8GiJr0UAwoN^~K zo2?GbDzi$R=)Mwv-@SrHjXpKk4HN5R?KSU{|t4lQIpk;dQ2*n|3R@ z3*i#DGPH&ghLL#_UBkHOB)WpYytQ zGN7Fhw9FMXVq*3+4unL3dk+l{i4P~wM=N`G`^vc=IhqT_mfcv+p^Mji$b?&^km_bK z$6TMe=o1ND=+rA(*cw9Rnwb*ERJZl&ZSN{)UvjPv3czv3XMKVc68(fNoNj9iMRxkP zHy!MQ+@-=n5%M+F+UP{{#$DzQCF2jpZyM&eu&=hMrjVo3&D8lw5rj3D_dyrL>mr+T zYf*1CWtleMaQ~b>15sqF0E`GhokeJ%b0U=Y*eyH2g6Kc5_@JRYT7Vt#->6CsJHUnH z?^i@pxOWCVGQ<0l{7>>C{SN^Zl)(TALdazT1d#n*29F#LWR;5y@mE|JO7xHu;$Ne+QM{9SO;Qkq(&uklOPx@c#u!udBz4P;-$j`xqk`8OU2>L`*2BRnI_zx%Df1jRqe7c^f=4kerU*O&hXoyX6Z diff --git a/docs/images/AddPrivateSequenceDiagram.png b/docs/images/AddPrivateSequenceDiagram.png index 8ee98c5e7c8ac4d77339248797bd7e262aef20d2..285b7c98227a7765505f6d9c76ee5e29bac288f2 100644 GIT binary patch literal 50176 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 V4HTKXt`AjEPsi}rqAPd*{4Xz}t$qLi literal 53495 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 From 9d857b51741087760bed480ac646496e9c66a5ba Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 21:11:15 +0800 Subject: [PATCH 28/34] Add ChangePrivacySequenceDiagram --- docs/diagrams/ChangePrivacySequenceDiagram.pptx | Bin 0 -> 44540 bytes docs/images/ChangePrivacySequenceDiagram.png | Bin 0 -> 59805 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/diagrams/ChangePrivacySequenceDiagram.pptx create mode 100644 docs/images/ChangePrivacySequenceDiagram.png diff --git a/docs/diagrams/ChangePrivacySequenceDiagram.pptx b/docs/diagrams/ChangePrivacySequenceDiagram.pptx new file mode 100644 index 0000000000000000000000000000000000000000..203987a75618816625667efbb2868bdd03a2ee04 GIT binary patch literal 44540 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 literal 0 HcmV?d00001 diff --git a/docs/images/ChangePrivacySequenceDiagram.png b/docs/images/ChangePrivacySequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..d40b8102151dcf5d177f6c638418b23f1b31f583 GIT binary patch literal 59805 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 Date: Tue, 24 Oct 2017 22:19:46 +0800 Subject: [PATCH 29/34] Update UserGuide --- docs/UserGuide.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/UserGuide.adoc b/docs/UserGuide.adoc index ddb309aecb65..e1364318265c 100644 --- a/docs/UserGuide.adoc +++ b/docs/UserGuide.adoc @@ -623,10 +623,14 @@ The program will learn your typing habits and give autocomplete suggestions that * *Add* : `add or a n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS b/BIRTHDAY f/FACULTY c/[GOOGLE CALENDAR URL] [t/TAG]...` + e.g. `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665, b/29-02-1996 f/SOC c/www.enteryourcalendarurlhere.com t/friend t/colleague` +* *Add with private fields* : `add or a pn/NAME pp/PHONE_NUMBER pe/EMAIL pa/ADDRESS b/BIRTHDAY f/FACULTY c/[GOOGLE CALENDAR URL] [t/TAG]...` + +e.g. `add pn/James Ho pp/22224444 pe/jamesho@example.com pa/123, Clementi Rd, 1234665` * *Add task* : `add task n/NAME d/DESCRIPTION [t/DEADLINE] [p/PRIORITY]` + e.g. `add task n/Update Documentation d/Update documentations for V1.1 for CS2103T t/30/10/17 p/high` * *Add tag* : `addtag INDEX t/[TAG]` + e.g. `addtag 1 2 t/friends` +* *Change a person's details' privacy* : `changeprivacy or cp INDEX [n/TRUE or FALSE] [p/TRUE or FALSE] [e/TRUE or FALSE] [a/TRUE or FALSE]` + +e.g. `changeprivacy 2 n/true p/false e/true a/false` * *Clear person* : `clear` * *Clear tasks* : `cleartask` * *Delete person* : `delete INDEX` + From fa92df7f620cf5027857028d36e51b6120693c14 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 22:20:06 +0800 Subject: [PATCH 30/34] Update DeveloperGuide --- docs/DeveloperGuide.adoc | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.adoc b/docs/DeveloperGuide.adoc index c2bc30d2f20f..93be4e7173fc 100644 --- a/docs/DeveloperGuide.adoc +++ b/docs/DeveloperGuide.adoc @@ -512,7 +512,6 @@ Note that the execution of the sort methods result in the actual person list bei **Pros:** Faster for the user to key in one word rather than a command with many words + **Cons:** Reduces choice for experienced users who may want to save to another location or use a different save name -// tag::Privacy === Privacy of fields The `Name`, `Phone`, `Email` and `Address` of a `Person` contains a boolean `isPrivate`, which will determine if the field belonging to that person is private or not. @@ -565,8 +564,6 @@ In addition, if `isPrivate` is `true` for `Name`, clicking on a person's card in Instead, a `NewResultAvailableEvent` will be raised by `BrowserPanel` to inform the user that they are not allowed to search for a person possessing a private `Name`. -`ChangePrivacyCommand` facilitates the setting of an existing person's field's privacy. Depending on the user's input, `ChangePrivacyCommand` will use each field's `setPrivate()` method to set the value of `isPrivate`. - To keep track of whether each field is private or not, `XmlAdaptedPerson` will have to store the `isPrivate` value for each field of `Person`. This is done by adding the following @@ -604,7 +601,6 @@ If an old save file without privacy data is loaded, then the `toModelType()` met If a private field is to be edited by `EditCommand`, `createEditedPerson()` in `EditCommand` will not modify the data of that field, even though `EditCommand` will create a new `CommandResult` with a success message. + Hence, a private field will remain private and the value stored by that field will remain the same as it originally was. - ==== Design Considerations **Aspect:** Implementation of `isPrivate` + @@ -624,7 +620,39 @@ Hence, a private field will remain private and the value stored by that field wi **Pros:** Easier implementation, do not have to modify `AddCommand`. + **Cons:** Requires 2 command lines to create a `Person` with private fields, which takes more time and is more inconvenient for users. -// end::Privacy +=== Changing of a Person's Privacy + +`ChangePrivacyCommand` facilitates the setting of an existing person's field's privacy. Depending on the user's input, `ChangePrivacyCommand` will use each field's `setPrivate()` method to set the value of `isPrivate`. + +The sequence diagram for `ChangePrivacyCommand` is illustrated below. + +image::ChangePrivacySequenceDiagram.png[width="800"] + +Upon receiving a String containing the arguments from `AddressBookParser`, `ChangePrivacyCommandParser` will create a `PersonPrivacySettings` object. + +Depending on the input, the `ChangePrivacyCommandParser` will set the privacy values, represented by Booleans, in the `PersonPrivacySettings` object to be `true` or `false`. + +`ChangePrivacyCommandParser` will then create a new `ChangePrivacyCommand` using the input `Index` and the `PersonPrivacySettings` + +When `ChangePrivacyCommand` starts executing, it will create a new `Person` based on the data of the `Person` at the specified `Index`. +It will then adjust the privacy values based on the input `PersonPrivacySettings`. + +Once it is done, it will update the original `Person` with the newly created `Person` in `Model`. + +[NOTE] +If there are missing fields in the input string, the getter methods in `PersonPrivacySettings` will return `false`, but the actual value stored will remain as `null`. +This allows `isAnyFieldNonNull` to check if the user has input any field at all. + +==== Design Considerations + +**Aspect:** How to implement changing of a person's privacy. + +**Alternative 1 (current choice):** Create a separate command to do so. + +**Pros:** It is clear to users and developers that `changeprivacy` is to modify a person's privacy while `edit` changes the actual data if the relevant field is not private. + +**Cons:** Additional command, parser and tests must be created. + +**Alternative 2:** Enhance the functionality of EditCommand. + +**Pros:** Can make use of existing code to aid the implementation. + +**Cons:** Increases the complexity of EditCommand for both users and developers. More ambiguous as to how editing a private field will affect the data. + === Add/Delete Tag mechanism From d2a782913e0a80e19b94645c2b7f4a52d06ae799 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 22:38:59 +0800 Subject: [PATCH 31/34] Update ChangePrivacyCommand --- .../seedu/address/logic/commands/ChangePrivacyCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index 0206254597b8..a9a4d6d32d39 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -101,6 +101,7 @@ private static Person createPersonWithChangedPrivacy(ReadOnlyPerson person, Pers Phone p = person.getPhone(); Email e = person.getEmail(); Address a = person.getAddress(); + Remark r = person.getRemark(); Set t = person.getTags(); if (pps.getNameIsPrivate() != null) { @@ -118,7 +119,7 @@ private static Person createPersonWithChangedPrivacy(ReadOnlyPerson person, Pers a.setPrivate(pps.getAddressIsPrivate()); } - return new Person(n, p, e, a, t); + return new Person(n, p, e, a, r, t); } public Index getIndex() { From 18fd4e1492539c5512ca2641ad0fbc31cd8493f5 Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 22:40:36 +0800 Subject: [PATCH 32/34] Update ChangePrivacyCommand --- .../java/seedu/address/logic/commands/ChangePrivacyCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java index a9a4d6d32d39..cb23793daf0e 100644 --- a/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChangePrivacyCommand.java @@ -20,6 +20,7 @@ import seedu.address.model.person.Person; import seedu.address.model.person.Phone; import seedu.address.model.person.ReadOnlyPerson; +import seedu.address.model.person.Remark; import seedu.address.model.person.exceptions.DuplicatePersonException; import seedu.address.model.person.exceptions.PersonNotFoundException; import seedu.address.model.tag.Tag; From 2905bc27b37fcf23d4eb9af363a6defc126f73fa Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 22:50:53 +0800 Subject: [PATCH 33/34] Fix checkstyle --- src/main/java/seedu/address/logic/commands/AddCommand.java | 1 - .../java/seedu/address/logic/parser/AddCommandParser.java | 6 +++--- src/main/java/seedu/address/ui/PersonCard.java | 1 - .../seedu/address/logic/parser/AddressBookParserTest.java | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index e6928a4c3fd6..6849a278f623 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -59,7 +59,6 @@ public class AddCommand extends UndoableCommand { public static final String MESSAGE_TASK_SUCCESS = "New task added: %1$s"; public static final String MESSAGE_SUCCESS = "New person added: \n%1$s"; - public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book"; public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the address book"; diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index 1d26b38aee31..c22fcac25620 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -52,9 +52,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_REMARK, - PREFIX_REMARK_PRIVATE, PREFIX_TAG, PREFIX_NAME_PRIVATE, PREFIX_PHONE_PRIVATE, PREFIX_EMAIL_PRIVATE, - PREFIX_ADDRESS_PRIVATE, PREFIX_TAG_PRIVATE, PREFIX_DEADLINE, PREFIX_DESCRIPTION, PREFIX_PRIORITY, - PREFIX_TASK); + PREFIX_REMARK_PRIVATE, PREFIX_TAG, PREFIX_NAME_PRIVATE, PREFIX_PHONE_PRIVATE, + PREFIX_EMAIL_PRIVATE, PREFIX_ADDRESS_PRIVATE, PREFIX_TAG_PRIVATE, PREFIX_DEADLINE, + PREFIX_DESCRIPTION, PREFIX_PRIORITY, PREFIX_TASK); if (arePrefixesPresent(argMultimap, PREFIX_TASK)) { ReadOnlyTask taskToAdd = constructTask(args); return new AddCommand(taskToAdd); diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index 2443a1ba2a3e..09c502249426 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -35,7 +35,6 @@ private enum Colours { */ public final ReadOnlyPerson person; - @FXML private HBox cardPane; @FXML diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index 1a3e8b0309ab..580faa98047b 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -5,8 +5,8 @@ import static org.junit.Assert.fail; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; -import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.commands.DeleteCommand.DELETE_TYPE_PERSON; +import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; import java.util.Arrays; From fe25c7756c08e2b9c8c02e737f52869cfddec2be Mon Sep 17 00:00:00 2001 From: Jeffrey Goh Date: Tue, 24 Oct 2017 23:50:20 +0800 Subject: [PATCH 34/34] Fix checkstyle --- .../seedu/address/logic/commands/ChangePrivacyCommandTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java index fcd5bc8d586f..eafd065a3466 100644 --- a/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ChangePrivacyCommandTest.java @@ -4,7 +4,6 @@ import static junit.framework.TestCase.assertFalse; import static seedu.address.logic.commands.ChangePrivacyCommand.PersonPrivacySettings; import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; import org.junit.Test;