From dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf Mon Sep 17 00:00:00 2001 From: Jeffry Lum <22460123+j-lum@users.noreply.github.com> Date: Thu, 6 Jun 2019 14:16:58 +0800 Subject: [PATCH] Logic: Teach the app to accept 'remark' arguments but still do nothing Modify RemarkCommand to take in an Index and String for remark, and print those two parameters as the error message Modify RemarkCommandTest to test the equals method Add RemarkCommandParser that will know how to parse two arguments, one index and one with prefix 'r/' Add RemarkCommandParserTest that will test different boundary values for RemarkCommandParser. Modify AddressBookParser to use the newly implemented RemarkCommandParser Modify AddressBookParserTest to ensure that what the user input generated the correct command. --- .../address/logic/commands/RemarkCommand.java | 37 +++++++++++++++- .../logic/parser/AddressBookParser.java | 2 +- .../logic/parser/RemarkCommandParser.java | 36 ++++++++++++++++ .../logic/commands/CommandTestUtil.java | 2 + .../logic/commands/RemarkCommandTest.java | 38 ++++++++++++++++- .../logic/parser/AddressBookParserTest.java | 6 ++- .../logic/parser/RemarkCommandParserTest.java | 42 +++++++++++++++++++ 7 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 src/main/java/seedu/address/logic/parser/RemarkCommandParser.java create mode 100644 src/test/java/seedu/address/logic/parser/RemarkCommandParserTest.java diff --git a/src/main/java/seedu/address/logic/commands/RemarkCommand.java b/src/main/java/seedu/address/logic/commands/RemarkCommand.java index e4e13204c..940c0ef35 100644 --- a/src/main/java/seedu/address/logic/commands/RemarkCommand.java +++ b/src/main/java/seedu/address/logic/commands/RemarkCommand.java @@ -1,7 +1,9 @@ package seedu.address.logic.commands; +import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK; +import seedu.address.commons.core.index.Index; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; @@ -20,10 +22,41 @@ public class RemarkCommand extends Command { + "Example: " + COMMAND_WORD + " 1 " + PREFIX_REMARK + "Likes to swim."; - public static final String MESSAGE_NOT_IMPLEMENTED_YET = "Remark command not implemented yet"; + public static final String MESSAGE_ARGUMENTS = "Index: %1$d, Remark: %2$s"; + private final Index index; + private final String remark; + + /** + * @param index of the person in the filtered person list to edit the remark + * @param remark of the person to be updated to + */ + public RemarkCommand(Index index, String remark) { + requireAllNonNull(index, remark); + + this.index = index; + this.remark = remark; + } @Override public CommandResult execute(Model model) throws CommandException { - throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET); + throw new CommandException(String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark)); + } + + @Override + public boolean equals(Object other) { + // short circuit if same object + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof RemarkCommand)) { + return false; + } + + // state check + RemarkCommand e = (RemarkCommand) other; + return index.equals(e.index) + && remark.equals(e.remark); } } diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index 5509310e1..eff2d21e8 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -61,7 +61,7 @@ public Command parseCommand(String userInput) throws ParseException { return new FindCommandParser().parse(arguments); case RemarkCommand.COMMAND_WORD: - return new RemarkCommand(); + return new RemarkCommandParser().parse(arguments); case ListCommand.COMMAND_WORD: return new ListCommand(); diff --git a/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java new file mode 100644 index 000000000..0be4d5220 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java @@ -0,0 +1,36 @@ +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_REMARK; + +import seedu.address.commons.core.index.Index; +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.logic.commands.RemarkCommand; +import seedu.address.logic.parser.exceptions.ParseException; + +/** + * Parses input arguments and creates a new {@code RemarkCommand} object + */ +public class RemarkCommandParser implements Parser { + /** + * Parses the given {@code String} of arguments in the context of the {@code RemarkCommand} + * and returns a {@code RemarkCommand} object for execution. + * @throws ParseException if the user input does not conform the expected format + */ + public RemarkCommand parse(String args) throws ParseException { + requireNonNull(args); + ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_REMARK); + + Index index; + try { + index = ParserUtil.parseIndex(argMultimap.getPreamble()); + } catch (IllegalValueException ive) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, RemarkCommand.MESSAGE_USAGE), ive); + } + + String remark = argMultimap.getValue(PREFIX_REMARK).orElse(""); + + return new RemarkCommand(index, remark); + } +} diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 643a1d080..313b370a7 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -34,6 +34,8 @@ public class CommandTestUtil { public static final String VALID_EMAIL_BOB = "bob@example.com"; public static final String VALID_ADDRESS_AMY = "Block 312, Amy Street 1"; public static final String VALID_ADDRESS_BOB = "Block 123, Bobby Street 3"; + public static final String VALID_REMARK_AMY = "Like skiing."; + public static final String VALID_REMARK_BOB = "Favourite pastime: Eating"; public static final String VALID_TAG_HUSBAND = "husband"; public static final String VALID_TAG_FRIEND = "friend"; diff --git a/src/test/java/seedu/address/logic/commands/RemarkCommandTest.java b/src/test/java/seedu/address/logic/commands/RemarkCommandTest.java index ae28ca754..da09c651b 100644 --- a/src/test/java/seedu/address/logic/commands/RemarkCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/RemarkCommandTest.java @@ -1,7 +1,14 @@ package seedu.address.logic.commands; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import static seedu.address.logic.commands.CommandTestUtil.VALID_REMARK_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_REMARK_BOB; import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; -import static seedu.address.logic.commands.RemarkCommand.MESSAGE_NOT_IMPLEMENTED_YET; +import static seedu.address.logic.commands.RemarkCommand.MESSAGE_ARGUMENTS; +import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; +import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; import org.junit.jupiter.api.Test; @@ -19,6 +26,33 @@ public class RemarkCommandTest { @Test public void execute() { - assertCommandFailure(new RemarkCommand(), model, MESSAGE_NOT_IMPLEMENTED_YET); + final String remark = "Some remark"; + + assertCommandFailure(new RemarkCommand(INDEX_FIRST_PERSON, remark), model, + String.format(MESSAGE_ARGUMENTS, INDEX_FIRST_PERSON.getOneBased(), remark)); + } + + @Test + public void equals() { + final RemarkCommand standardCommand = new RemarkCommand(INDEX_FIRST_PERSON, VALID_REMARK_AMY); + + // same values -> returns true + RemarkCommand commandWithSameValues = new RemarkCommand(INDEX_FIRST_PERSON, VALID_REMARK_AMY); + assertTrue(standardCommand.equals(commandWithSameValues)); + + // same object -> returns true + assertTrue(standardCommand.equals(standardCommand)); + + // null -> returns false + assertFalse(standardCommand.equals(null)); + + // different types -> returns false + assertFalse(standardCommand.equals(new ClearCommand())); + + // different index -> returns false + assertFalse(standardCommand.equals(new RemarkCommand(INDEX_SECOND_PERSON, VALID_REMARK_AMY))); + + // different remark -> returns false + assertFalse(standardCommand.equals(new RemarkCommand(INDEX_FIRST_PERSON, VALID_REMARK_BOB))); } } diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index aab9384fd..fb413f512 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; 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_REMARK; import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; @@ -91,7 +92,10 @@ public void parseCommand_list() throws Exception { @Test public void parseCommand_remark() throws Exception { - assertTrue(parser.parseCommand(RemarkCommand.COMMAND_WORD) instanceof RemarkCommand); + final String remark = "Some remark."; + RemarkCommand command = (RemarkCommand) parser.parseCommand(RemarkCommand.COMMAND_WORD + " " + + INDEX_FIRST_PERSON.getOneBased() + " " + PREFIX_REMARK + remark); + assertEquals(new RemarkCommand(INDEX_FIRST_PERSON, remark), command); } @Test diff --git a/src/test/java/seedu/address/logic/parser/RemarkCommandParserTest.java b/src/test/java/seedu/address/logic/parser/RemarkCommandParserTest.java new file mode 100644 index 000000000..9118a73f0 --- /dev/null +++ b/src/test/java/seedu/address/logic/parser/RemarkCommandParserTest.java @@ -0,0 +1,42 @@ +package seedu.address.logic.parser; + +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK; +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 org.junit.jupiter.api.Test; + +import seedu.address.commons.core.index.Index; +import seedu.address.logic.commands.RemarkCommand; + +public class RemarkCommandParserTest { + private RemarkCommandParser parser = new RemarkCommandParser(); + private final String nonEmptyRemark = "Some remark."; + + @Test + public void parse_indexSpecified_success() { + // have remark + Index targetIndex = INDEX_FIRST_PERSON; + String userInput = targetIndex.getOneBased() + " " + PREFIX_REMARK + nonEmptyRemark; + RemarkCommand expectedCommand = new RemarkCommand(INDEX_FIRST_PERSON, nonEmptyRemark); + assertParseSuccess(parser, userInput, expectedCommand); + + // no remark + userInput = targetIndex.getOneBased() + " " + PREFIX_REMARK; + expectedCommand = new RemarkCommand(INDEX_FIRST_PERSON, ""); + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_missingCompulsoryField_failure() { + String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, RemarkCommand.MESSAGE_USAGE); + + // no parameters + assertParseFailure(parser, RemarkCommand.COMMAND_WORD, expectedMessage); + + // no index + assertParseFailure(parser, RemarkCommand.COMMAND_WORD + " " + nonEmptyRemark, expectedMessage); + } +}