From be3eee29161816aa66a8943943b621f70db21c4e Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 10 Nov 2019 02:51:38 +0800 Subject: [PATCH 1/7] Add restriction to disallow command execution when current list is empty --- .../java/io/xpire/commons/core/Messages.java | 1 + .../io/xpire/logic/commands/CheckCommand.java | 4 +- .../io/xpire/logic/commands/ClearCommand.java | 8 ++-- .../java/io/xpire/logic/commands/Command.java | 8 ++++ .../xpire/logic/commands/DeleteCommand.java | 5 ++- .../xpire/logic/commands/ExportCommand.java | 4 +- .../io/xpire/logic/commands/RedoCommand.java | 4 +- .../xpire/logic/commands/SearchCommand.java | 6 ++- .../logic/commands/SetReminderCommand.java | 4 +- .../logic/commands/ShiftToMainCommand.java | 5 ++- .../commands/ShiftToReplenishCommand.java | 6 +-- .../io/xpire/logic/commands/SortCommand.java | 8 ++-- .../io/xpire/logic/commands/TagCommand.java | 4 +- .../io/xpire/logic/commands/UndoCommand.java | 4 +- .../io/xpire/commons/util/StringUtilTest.java | 2 +- .../java/io/xpire/logic/LogicManagerTest.java | 3 +- .../logic/commands/ClearCommandTest.java | 45 +++++++++++++------ .../xpire/logic/commands/TagCommandTest.java | 3 +- 18 files changed, 83 insertions(+), 41 deletions(-) diff --git a/src/main/java/io/xpire/commons/core/Messages.java b/src/main/java/io/xpire/commons/core/Messages.java index 6bc686eb41f..a57e117444b 100644 --- a/src/main/java/io/xpire/commons/core/Messages.java +++ b/src/main/java/io/xpire/commons/core/Messages.java @@ -19,4 +19,5 @@ public class Messages { "The item has only %s day(s) left before expiring. \nReminder will start from today!"; public static final String MESSAGE_THRESHOLD_ITEM_EXPIRED = "Cannot set reminder for expired item!"; public static final String MESSAGE_VIEW_OPTIONS = "Only two lists (main and replenish) are available to view."; + public static final String MESSAGE_EMPTY_LIST = "Command not executed. The current list is empty!"; } diff --git a/src/main/java/io/xpire/logic/commands/CheckCommand.java b/src/main/java/io/xpire/logic/commands/CheckCommand.java index 221146c1181..1162111f07e 100644 --- a/src/main/java/io/xpire/logic/commands/CheckCommand.java +++ b/src/main/java/io/xpire/logic/commands/CheckCommand.java @@ -5,6 +5,7 @@ import java.util.function.Predicate; +import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.model.Model; import io.xpire.model.item.ExpiringSoonPredicate; import io.xpire.model.item.ReminderThresholdExceededPredicate; @@ -44,8 +45,9 @@ public CheckCommand(ReminderThresholdExceededPredicate predicate) { } @Override - public CommandResult execute(Model model, StateManager stateManager) { + public CommandResult execute(Model model, StateManager stateManager) throws CommandException { requireAllNonNull(model, stateManager); + this.requireNonEmptyCurrentList(model); stateManager.saveState(new FilteredState(model)); model.filterCurrentList(XPIRE, this.predicate); diff --git a/src/main/java/io/xpire/logic/commands/ClearCommand.java b/src/main/java/io/xpire/logic/commands/ClearCommand.java index 988194f3e30..192e094281a 100644 --- a/src/main/java/io/xpire/logic/commands/ClearCommand.java +++ b/src/main/java/io/xpire/logic/commands/ClearCommand.java @@ -2,6 +2,7 @@ import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; +import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.model.ListType; import io.xpire.model.Model; import io.xpire.model.item.Item; @@ -34,11 +35,12 @@ public ClearCommand(ListType listType) { } @Override - public CommandResult execute(Model model, StateManager stateManager) { + public CommandResult execute(Model model, StateManager stateManager) throws CommandException { requireAllNonNull(model, stateManager); - stateManager.saveState(new ModifiedState(model)); + this.requireNonEmptyCurrentList(model); - //remove list dependency on xpire/replenish internal list + stateManager.saveState(new ModifiedState(model)); + //gets the current list and remove list dependency on xpire/replenish internal list ObservableList currentList = FXCollections.observableArrayList(model.getCurrentList()); currentList.forEach(item -> model.deleteItem(this.listType, item)); setShowInHistory(true); diff --git a/src/main/java/io/xpire/logic/commands/Command.java b/src/main/java/io/xpire/logic/commands/Command.java index c59d2eb5304..aae8dc69a7c 100644 --- a/src/main/java/io/xpire/logic/commands/Command.java +++ b/src/main/java/io/xpire/logic/commands/Command.java @@ -1,5 +1,7 @@ package io.xpire.logic.commands; +import static io.xpire.commons.core.Messages.MESSAGE_EMPTY_LIST; + import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.logic.parser.exceptions.ParseException; import io.xpire.model.Model; @@ -40,4 +42,10 @@ public boolean isShowInHistory() { public void setShowInHistory(boolean showInHistory) { this.showInHistory = showInHistory; } + + protected void requireNonEmptyCurrentList(Model model) throws CommandException { + if (model.getCurrentList().isEmpty()) { + throw new CommandException(MESSAGE_EMPTY_LIST); + } + } } diff --git a/src/main/java/io/xpire/logic/commands/DeleteCommand.java b/src/main/java/io/xpire/logic/commands/DeleteCommand.java index cd99a29d6d6..697600bc509 100644 --- a/src/main/java/io/xpire/logic/commands/DeleteCommand.java +++ b/src/main/java/io/xpire/logic/commands/DeleteCommand.java @@ -1,9 +1,9 @@ package io.xpire.logic.commands; import static io.xpire.commons.core.Messages.MESSAGE_REPLENISH_SHIFT_SUCCESS; +import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; import static io.xpire.model.ListType.REPLENISH; import static io.xpire.model.ListType.XPIRE; -import static java.util.Objects.requireNonNull; import java.util.Set; import java.util.TreeSet; @@ -87,7 +87,8 @@ public DeleteCommand(ListType listType, Index targetIndex, Quantity quantity) { @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException, ParseException { - requireNonNull(model); + requireAllNonNull(model,stateManager); + this.requireNonEmptyCurrentList(model); stateManager.saveState(new ModifiedState(model)); ObservableList currentList = model.getCurrentList(); diff --git a/src/main/java/io/xpire/logic/commands/ExportCommand.java b/src/main/java/io/xpire/logic/commands/ExportCommand.java index 76348a2f9a1..01d36ebe717 100644 --- a/src/main/java/io/xpire/logic/commands/ExportCommand.java +++ b/src/main/java/io/xpire/logic/commands/ExportCommand.java @@ -3,6 +3,7 @@ import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; import io.xpire.commons.util.StringUtil; +import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.model.Model; import io.xpire.model.item.Item; import io.xpire.model.state.StateManager; @@ -30,8 +31,9 @@ public class ExportCommand extends Command { private static final int RESOLUTION_SIZE = 800; @Override - public CommandResult execute(Model model, StateManager stateManager) { + public CommandResult execute(Model model, StateManager stateManager) throws CommandException { requireAllNonNull(model, stateManager); + this.requireNonEmptyCurrentList(model); ObservableList currentList = model.getCurrentList(); StringBuilder formattedOutput = new StringBuilder(BORDER); diff --git a/src/main/java/io/xpire/logic/commands/RedoCommand.java b/src/main/java/io/xpire/logic/commands/RedoCommand.java index 9c789cc08a6..1bb154ed8ca 100644 --- a/src/main/java/io/xpire/logic/commands/RedoCommand.java +++ b/src/main/java/io/xpire/logic/commands/RedoCommand.java @@ -1,6 +1,6 @@ package io.xpire.logic.commands; -import static java.util.Objects.requireNonNull; +import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.model.Model; @@ -19,7 +19,7 @@ public class RedoCommand extends Command { @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException { - requireNonNull(model); + requireAllNonNull(model, stateManager); if (stateManager.isNotRedoable()) { throw new CommandException(MESSAGE_REDO_FAILURE); } diff --git a/src/main/java/io/xpire/logic/commands/SearchCommand.java b/src/main/java/io/xpire/logic/commands/SearchCommand.java index f31ad9c348d..1d6c50fd6cc 100644 --- a/src/main/java/io/xpire/logic/commands/SearchCommand.java +++ b/src/main/java/io/xpire/logic/commands/SearchCommand.java @@ -7,6 +7,7 @@ import io.xpire.commons.core.Messages; import io.xpire.commons.util.StringUtil; +import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.model.ListType; import io.xpire.model.Model; import io.xpire.model.item.ContainsKeywordsPredicate; @@ -52,12 +53,13 @@ public SearchCommand(ListType listType, ContainsKeywordsPredicate predicate) { } @Override - public CommandResult execute(Model model, StateManager stateManager) { + public CommandResult execute(Model model, StateManager stateManager) throws CommandException { requireAllNonNull(model, stateManager); - stateManager.saveState(new FilteredState(model)); + this.requireNonEmptyCurrentList(model); //Saves the current copy of the list view ObservableList previousList = FXCollections.observableArrayList(model.getCurrentList()); + stateManager.saveState(new FilteredState(model)); //Updates the list view model.filterCurrentList(this.listType, this.predicate); //Retrieves the updated list view diff --git a/src/main/java/io/xpire/logic/commands/SetReminderCommand.java b/src/main/java/io/xpire/logic/commands/SetReminderCommand.java index 13568e9e013..02168385b12 100644 --- a/src/main/java/io/xpire/logic/commands/SetReminderCommand.java +++ b/src/main/java/io/xpire/logic/commands/SetReminderCommand.java @@ -4,7 +4,6 @@ import static io.xpire.commons.core.Messages.MESSAGE_THRESHOLD_ITEM_EXPIRED; import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; import static io.xpire.model.ListType.XPIRE; -import static java.util.Objects.requireNonNull; import io.xpire.commons.core.Messages; import io.xpire.commons.core.index.Index; @@ -53,7 +52,8 @@ public SetReminderCommand(Index index, ReminderThreshold threshold) { @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException { - requireNonNull(model); + requireAllNonNull(model, stateManager); + this.requireNonEmptyCurrentList(model); stateManager.saveState(new ModifiedState(model)); ObservableList currentList = model.getCurrentList(); diff --git a/src/main/java/io/xpire/logic/commands/ShiftToMainCommand.java b/src/main/java/io/xpire/logic/commands/ShiftToMainCommand.java index f2f491943f0..de58069e3d6 100644 --- a/src/main/java/io/xpire/logic/commands/ShiftToMainCommand.java +++ b/src/main/java/io/xpire/logic/commands/ShiftToMainCommand.java @@ -1,9 +1,9 @@ package io.xpire.logic.commands; import static io.xpire.commons.core.Messages.MESSAGE_INVALID_ITEM_DISPLAYED_INDEX; +import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; import static io.xpire.model.ListType.REPLENISH; import static io.xpire.model.ListType.XPIRE; -import static java.util.Objects.requireNonNull; import java.util.List; @@ -46,7 +46,8 @@ public ShiftToMainCommand(Index targetIndex, ExpiryDate expiryDate, Quantity qua @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException { - requireNonNull(model); + requireAllNonNull(model, stateManager); + this.requireNonEmptyCurrentList(model); stateManager.saveState(new ModifiedState(model)); List lastShownList = model.getCurrentList(); diff --git a/src/main/java/io/xpire/logic/commands/ShiftToReplenishCommand.java b/src/main/java/io/xpire/logic/commands/ShiftToReplenishCommand.java index c451370a244..197d9cf9650 100644 --- a/src/main/java/io/xpire/logic/commands/ShiftToReplenishCommand.java +++ b/src/main/java/io/xpire/logic/commands/ShiftToReplenishCommand.java @@ -1,9 +1,9 @@ package io.xpire.logic.commands; import static io.xpire.commons.core.Messages.MESSAGE_INVALID_ITEM_DISPLAYED_INDEX; +import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; import static io.xpire.model.ListType.REPLENISH; import static io.xpire.model.ListType.XPIRE; -import static java.util.Objects.requireNonNull; import java.util.HashSet; import java.util.List; @@ -45,8 +45,8 @@ public ShiftToReplenishCommand(Index targetIndex) { @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException { - - requireNonNull(model); + requireAllNonNull(model, stateManager); + this.requireNonEmptyCurrentList(model); stateManager.saveState(new ModifiedState(model)); List lastShownList = model.getCurrentList(); diff --git a/src/main/java/io/xpire/logic/commands/SortCommand.java b/src/main/java/io/xpire/logic/commands/SortCommand.java index a26ee203ce7..62a0f503926 100644 --- a/src/main/java/io/xpire/logic/commands/SortCommand.java +++ b/src/main/java/io/xpire/logic/commands/SortCommand.java @@ -1,7 +1,8 @@ package io.xpire.logic.commands; -import static java.util.Objects.requireNonNull; +import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; +import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.model.Model; import io.xpire.model.item.sort.XpireMethodOfSorting; import io.xpire.model.state.FilteredState; @@ -32,8 +33,9 @@ public SortCommand(XpireMethodOfSorting method) { } @Override - public CommandResult execute(Model model, StateManager stateManager) { - requireNonNull(model); + public CommandResult execute(Model model, StateManager stateManager)throws CommandException { + requireAllNonNull(model, stateManager); + this.requireNonEmptyCurrentList(model); stateManager.saveState(new FilteredState(model)); model.sortXpire(this.method); //model.updateFilteredItemList(Model.PREDICATE_SORT_ALL_ITEMS); diff --git a/src/main/java/io/xpire/logic/commands/TagCommand.java b/src/main/java/io/xpire/logic/commands/TagCommand.java index c324fe5e1c4..6523530b821 100644 --- a/src/main/java/io/xpire/logic/commands/TagCommand.java +++ b/src/main/java/io/xpire/logic/commands/TagCommand.java @@ -93,7 +93,9 @@ public TagMode getMode() { @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException { - requireAllNonNull(model); + requireAllNonNull(model, stateManager); + this.requireNonEmptyCurrentList(model); + switch (this.mode) { case TAG: return executeAddTags(model, stateManager); diff --git a/src/main/java/io/xpire/logic/commands/UndoCommand.java b/src/main/java/io/xpire/logic/commands/UndoCommand.java index 22092dc9b82..79afb2a7efe 100644 --- a/src/main/java/io/xpire/logic/commands/UndoCommand.java +++ b/src/main/java/io/xpire/logic/commands/UndoCommand.java @@ -1,6 +1,6 @@ package io.xpire.logic.commands; -import static java.util.Objects.requireNonNull; +import static io.xpire.commons.util.CollectionUtil.requireAllNonNull; import io.xpire.logic.commands.exceptions.CommandException; import io.xpire.model.Model; @@ -20,7 +20,7 @@ public class UndoCommand extends Command { @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException { - requireNonNull(model); + requireAllNonNull(model, stateManager); if (stateManager.isNotUndoable()) { throw new CommandException(MESSAGE_UNDO_FAILURE); } diff --git a/src/test/java/io/xpire/commons/util/StringUtilTest.java b/src/test/java/io/xpire/commons/util/StringUtilTest.java index cea46a8ee24..179fa3605d2 100644 --- a/src/test/java/io/xpire/commons/util/StringUtilTest.java +++ b/src/test/java/io/xpire/commons/util/StringUtilTest.java @@ -162,7 +162,7 @@ public void isNonNegativeInteger() { // EP: signed numbers assertFalse(StringUtil.isNonNegativeInteger("-1")); - assertFalse(StringUtil.isNonNegativeInteger("+1")); //"+1" is successfully parsed by Integer#parseInt(String) + assertFalse(StringUtil.isNonNegativeInteger("+1")); // "+1" is successfully parsed by Integer#parseInt(String) // EP: numbers with white space assertFalse(StringUtil.isNonNegativeInteger(" 101 ")); // Leading/trailing spaces diff --git a/src/test/java/io/xpire/logic/LogicManagerTest.java b/src/test/java/io/xpire/logic/LogicManagerTest.java index 02558ccd4a9..8688c85d14a 100644 --- a/src/test/java/io/xpire/logic/LogicManagerTest.java +++ b/src/test/java/io/xpire/logic/LogicManagerTest.java @@ -1,5 +1,6 @@ package io.xpire.logic; +import static io.xpire.commons.core.Messages.MESSAGE_EMPTY_LIST; import static io.xpire.commons.core.Messages.MESSAGE_INVALID_ITEM_DISPLAYED_INDEX; import static io.xpire.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; import static io.xpire.model.ListType.XPIRE; @@ -59,7 +60,7 @@ public void execute_invalidCommandFormat_throwsParseException() { @Test public void execute_commandExecutionError_throwsCommandException() { String deleteCommand = "delete|9"; - assertCommandException(deleteCommand, MESSAGE_INVALID_ITEM_DISPLAYED_INDEX); + assertCommandException(deleteCommand, MESSAGE_EMPTY_LIST); } @Test diff --git a/src/test/java/io/xpire/logic/commands/ClearCommandTest.java b/src/test/java/io/xpire/logic/commands/ClearCommandTest.java index 8749f6231e3..cfb6e9cdaf8 100644 --- a/src/test/java/io/xpire/logic/commands/ClearCommandTest.java +++ b/src/test/java/io/xpire/logic/commands/ClearCommandTest.java @@ -1,9 +1,12 @@ package io.xpire.logic.commands; +import static io.xpire.commons.core.Messages.MESSAGE_EMPTY_LIST; import static io.xpire.model.ListType.REPLENISH; import static io.xpire.model.ListType.XPIRE; import static io.xpire.testutil.TypicalItems.getTypicalLists; +import java.util.List; + import org.junit.jupiter.api.Test; import io.xpire.model.Model; @@ -11,39 +14,42 @@ import io.xpire.model.ReplenishList; import io.xpire.model.UserPrefs; import io.xpire.model.Xpire; +import io.xpire.model.item.ContainsKeywordsPredicate; +//@@author JermyTan public class ClearCommandTest { @Test - public void execute_emptyXpire_success() { + public void execute_emptyXpire_failure() { Model model = new ModelManager(); - Model expectedModel = new ModelManager(); - CommandTestUtil.assertCommandSuccess(new ClearCommand(XPIRE), model, - ClearCommand.MESSAGE_SUCCESS, expectedModel); + CommandTestUtil.assertCommandFailure(new ClearCommand(XPIRE), model, MESSAGE_EMPTY_LIST); } @Test - public void execute_nonEmptyXpire_success() { - Model model = new ModelManager(getTypicalLists(), new UserPrefs()); - Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); - expectedModel.setXpire(new Xpire()); + public void execute_emptyReplenishList_failure() { + Model model = new ModelManager(); - CommandTestUtil.assertCommandSuccess(new ClearCommand(XPIRE), model, - ClearCommand.MESSAGE_SUCCESS, expectedModel); + CommandTestUtil.assertCommandFailure(new ClearCommand(REPLENISH), model, MESSAGE_EMPTY_LIST); } @Test - public void execute_emptyReplenishList_success() { + public void execute_emptyXpireFiltered_failure() { Model model = new ModelManager(); - Model expectedModel = new ModelManager(); + } - CommandTestUtil.assertCommandSuccess(new ClearCommand(REPLENISH), model, + @Test + public void execute_nonEmptyXpireViewAll_success() { + Model model = new ModelManager(getTypicalLists(), new UserPrefs()); + Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); + expectedModel.setXpire(new Xpire()); + + CommandTestUtil.assertCommandSuccess(new ClearCommand(XPIRE), model, ClearCommand.MESSAGE_SUCCESS, expectedModel); } @Test - public void execute_nonEmptyReplenishList_success() { + public void execute_nonEmptyReplenishListViewAll_success() { Model model = new ModelManager(getTypicalLists(), new UserPrefs()); Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); expectedModel.setReplenishList(new ReplenishList()); @@ -52,4 +58,15 @@ public void execute_nonEmptyReplenishList_success() { CommandTestUtil.assertCommandSuccess(new ClearCommand(REPLENISH), model, ClearCommand.MESSAGE_SUCCESS, expectedModel); } +/* + @Test + protected void execute_NonEmptyXpireFilter_success() { + Model model = new ModelManager(getTypicalLists(), new UserPrefs()); + Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); + model.filterCurrentList(XPIRE, new ContainsKeywordsPredicate(List.of(new String[] {"i"}))); + + CommandTestUtil.assertCommandSuccess(new ClearCommand(XPIRE), model, + ClearCommand.MESSAGE_SUCCESS, expectedModel); + } + */ } diff --git a/src/test/java/io/xpire/logic/commands/TagCommandTest.java b/src/test/java/io/xpire/logic/commands/TagCommandTest.java index 4e08a4920f7..2fa46af828e 100644 --- a/src/test/java/io/xpire/logic/commands/TagCommandTest.java +++ b/src/test/java/io/xpire/logic/commands/TagCommandTest.java @@ -1,5 +1,6 @@ package io.xpire.logic.commands; +import static io.xpire.commons.core.Messages.MESSAGE_EMPTY_LIST; import static io.xpire.logic.commands.CommandTestUtil.assertCommandFailure; import static io.xpire.logic.commands.CommandTestUtil.assertCommandSuccess; import static io.xpire.logic.commands.CommandTestUtil.showReplenishItemAtIndex; @@ -188,7 +189,7 @@ public void execute_noTagsInXpire_success() { TagCommand tagCommand = new TagCommand(XPIRE); assertEquals(tagCommand.getMode(), TagCommand.TagMode.SHOW); ModelManager expectedModel = new ModelManager(); - assertCommandSuccess(tagCommand, expectedModel, TagCommand.MESSAGE_TAG_SHOW_FAILURE, expectedModel); + assertCommandFailure(tagCommand, expectedModel, MESSAGE_EMPTY_LIST); } From 69da32360ee04e6193a746d43e40569b418ff696 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 10 Nov 2019 03:22:39 +0800 Subject: [PATCH 2/7] Update commands tests --- .../xpire/logic/commands/CommandResult.java | 2 +- .../xpire/logic/commands/DeleteCommand.java | 2 +- .../java/io/xpire/logic/LogicManagerTest.java | 1 - .../logic/commands/ClearCommandTest.java | 24 ++----------------- .../logic/commands/CommandResultTest.java | 16 +++++++++++++ .../logic/commands/SearchCommandTest.java | 21 +++++++++++++++- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/main/java/io/xpire/logic/commands/CommandResult.java b/src/main/java/io/xpire/logic/commands/CommandResult.java index 42c7d166e92..f700b270b4d 100644 --- a/src/main/java/io/xpire/logic/commands/CommandResult.java +++ b/src/main/java/io/xpire/logic/commands/CommandResult.java @@ -58,7 +58,7 @@ public CommandResult(String feedbackToUser) { * and other fields set to their default value. */ public CommandResult(String feedbackToUser, boolean showQr, byte[] pngData) { - this(feedbackToUser, false, false, true, pngData); + this(feedbackToUser, false, false, showQr, pngData); } public String getFeedbackToUser() { diff --git a/src/main/java/io/xpire/logic/commands/DeleteCommand.java b/src/main/java/io/xpire/logic/commands/DeleteCommand.java index 697600bc509..60c6d8da791 100644 --- a/src/main/java/io/xpire/logic/commands/DeleteCommand.java +++ b/src/main/java/io/xpire/logic/commands/DeleteCommand.java @@ -87,7 +87,7 @@ public DeleteCommand(ListType listType, Index targetIndex, Quantity quantity) { @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException, ParseException { - requireAllNonNull(model,stateManager); + requireAllNonNull(model, stateManager); this.requireNonEmptyCurrentList(model); stateManager.saveState(new ModifiedState(model)); ObservableList currentList = model.getCurrentList(); diff --git a/src/test/java/io/xpire/logic/LogicManagerTest.java b/src/test/java/io/xpire/logic/LogicManagerTest.java index 8688c85d14a..b343e88b196 100644 --- a/src/test/java/io/xpire/logic/LogicManagerTest.java +++ b/src/test/java/io/xpire/logic/LogicManagerTest.java @@ -1,7 +1,6 @@ package io.xpire.logic; import static io.xpire.commons.core.Messages.MESSAGE_EMPTY_LIST; -import static io.xpire.commons.core.Messages.MESSAGE_INVALID_ITEM_DISPLAYED_INDEX; import static io.xpire.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; import static io.xpire.model.ListType.XPIRE; import static io.xpire.testutil.Assert.assertThrows; diff --git a/src/test/java/io/xpire/logic/commands/ClearCommandTest.java b/src/test/java/io/xpire/logic/commands/ClearCommandTest.java index cfb6e9cdaf8..57339f3d8e3 100644 --- a/src/test/java/io/xpire/logic/commands/ClearCommandTest.java +++ b/src/test/java/io/xpire/logic/commands/ClearCommandTest.java @@ -5,8 +5,6 @@ import static io.xpire.model.ListType.XPIRE; import static io.xpire.testutil.TypicalItems.getTypicalLists; -import java.util.List; - import org.junit.jupiter.api.Test; import io.xpire.model.Model; @@ -14,9 +12,7 @@ import io.xpire.model.ReplenishList; import io.xpire.model.UserPrefs; import io.xpire.model.Xpire; -import io.xpire.model.item.ContainsKeywordsPredicate; -//@@author JermyTan public class ClearCommandTest { @Test @@ -34,12 +30,7 @@ public void execute_emptyReplenishList_failure() { } @Test - public void execute_emptyXpireFiltered_failure() { - Model model = new ModelManager(); - } - - @Test - public void execute_nonEmptyXpireViewAll_success() { + public void execute_nonEmptyXpire_success() { Model model = new ModelManager(getTypicalLists(), new UserPrefs()); Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); expectedModel.setXpire(new Xpire()); @@ -49,7 +40,7 @@ public void execute_nonEmptyXpireViewAll_success() { } @Test - public void execute_nonEmptyReplenishListViewAll_success() { + public void execute_nonEmptyReplenishList_success() { Model model = new ModelManager(getTypicalLists(), new UserPrefs()); Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); expectedModel.setReplenishList(new ReplenishList()); @@ -58,15 +49,4 @@ public void execute_nonEmptyReplenishListViewAll_success() { CommandTestUtil.assertCommandSuccess(new ClearCommand(REPLENISH), model, ClearCommand.MESSAGE_SUCCESS, expectedModel); } -/* - @Test - protected void execute_NonEmptyXpireFilter_success() { - Model model = new ModelManager(getTypicalLists(), new UserPrefs()); - Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); - model.filterCurrentList(XPIRE, new ContainsKeywordsPredicate(List.of(new String[] {"i"}))); - - CommandTestUtil.assertCommandSuccess(new ClearCommand(XPIRE), model, - ClearCommand.MESSAGE_SUCCESS, expectedModel); - } - */ } diff --git a/src/test/java/io/xpire/logic/commands/CommandResultTest.java b/src/test/java/io/xpire/logic/commands/CommandResultTest.java index f2bb2a382ab..817fe242cbc 100644 --- a/src/test/java/io/xpire/logic/commands/CommandResultTest.java +++ b/src/test/java/io/xpire/logic/commands/CommandResultTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; +//@@author JermyTan public class CommandResultTest { @Test public void equals() { @@ -15,6 +16,7 @@ public void equals() { // same values -> returns true assertTrue(commandResult.equals(new CommandResult("feedback"))); assertTrue(commandResult.equals(new CommandResult("feedback", false, false))); + assertTrue(commandResult.equals(new CommandResult("feedback", false, new byte[0]))); // same object -> returns true assertTrue(commandResult.equals(commandResult)); @@ -33,6 +35,12 @@ public void equals() { // different exit value -> returns false assertFalse(commandResult.equals(new CommandResult("feedback", false, true))); + + // different showQr value -> returns false + assertFalse(commandResult.equals(new CommandResult("feedback", true, new byte[0]))); + + // different pngData value -> returns false + assertFalse(commandResult.equals(new CommandResult("feedback", false, "1".getBytes()))); } @Test @@ -41,6 +49,8 @@ public void hashcode() { // same values -> returns same hashcode assertEquals(commandResult.hashCode(), new CommandResult("feedback").hashCode()); + assertEquals(commandResult.hashCode(), new CommandResult("feedback", false, false).hashCode()); + assertEquals(commandResult.hashCode(), new CommandResult("feedback", false, new byte[0]).hashCode()); // different feedbackToUser value -> returns different hashcode assertNotEquals(commandResult.hashCode(), new CommandResult("different").hashCode()); @@ -50,5 +60,11 @@ public void hashcode() { // different exit value -> returns different hashcode assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", false, true).hashCode()); + + // different showQr value -> returns different hashcode + assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", true, new byte[0]).hashCode()); + + // different pngData value -> returns different hashcode + assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", false, "1".getBytes()).hashCode()); } } diff --git a/src/test/java/io/xpire/logic/commands/SearchCommandTest.java b/src/test/java/io/xpire/logic/commands/SearchCommandTest.java index 3d5ffda52a6..2dc7ee33af8 100644 --- a/src/test/java/io/xpire/logic/commands/SearchCommandTest.java +++ b/src/test/java/io/xpire/logic/commands/SearchCommandTest.java @@ -1,8 +1,11 @@ package io.xpire.logic.commands; +import static io.xpire.commons.core.Messages.MESSAGE_EMPTY_LIST; import static io.xpire.commons.core.Messages.MESSAGE_ITEMS_LISTED_OVERVIEW; import static io.xpire.commons.core.Messages.MESSAGE_SUGGESTIONS; +import static io.xpire.logic.commands.CommandTestUtil.assertCommandFailure; import static io.xpire.logic.commands.CommandTestUtil.assertCommandSuccess; +import static io.xpire.model.ListType.REPLENISH; import static io.xpire.model.ListType.XPIRE; import static io.xpire.testutil.TypicalItems.BANANA; import static io.xpire.testutil.TypicalItems.DUCK; @@ -17,11 +20,13 @@ import org.junit.jupiter.api.Test; +import io.xpire.logic.parser.Parser; import io.xpire.model.Model; import io.xpire.model.ModelManager; import io.xpire.model.UserPrefs; import io.xpire.model.item.ContainsKeywordsPredicate; +//@@author JermyTan /** * Contains integration tests (interaction with the Model) for {@code SearchCommand}. */ @@ -56,6 +61,20 @@ public void equals() { assertFalse(findFirstCommand.equals(findSecondCommand)); } + @Test + public void execute_emptyXpire_failure() { + Model model = new ModelManager(); + + assertCommandFailure(new SearchCommand(XPIRE, preparePredicate("test")), model, MESSAGE_EMPTY_LIST); + } + + @Test + public void execute_emptyReplenishList_failure() { + Model model = new ModelManager(); + + assertCommandFailure(new SearchCommand(REPLENISH, preparePredicate("test")), model, MESSAGE_EMPTY_LIST); + } + @Test public void execute_noMatchingKeywords_noItemsFoundNoRecommendations() { String expectedMessage = String.format(MESSAGE_ITEMS_LISTED_OVERVIEW, 0); @@ -123,6 +142,6 @@ public void execute_someMatchingKeywords_multipleItemsFound() { * Parses {@code userInput} into a {@code ContainsKeywordsPredicate}. */ private ContainsKeywordsPredicate preparePredicate(String parsedUserInput) { - return new ContainsKeywordsPredicate(Arrays.asList(parsedUserInput.split("\\|"))); + return new ContainsKeywordsPredicate(Arrays.asList(parsedUserInput.split(Parser.SEPARATOR))); } } From e609e6e8be336ad0d09fc5200497e3ddf3973659 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 10 Nov 2019 03:31:17 +0800 Subject: [PATCH 3/7] Update new tag format --- .../java/io/xpire/model/item/ContainsKeywordsPredicate.java | 2 +- src/main/java/io/xpire/model/item/Item.java | 4 ++-- src/main/java/io/xpire/model/item/XpireItem.java | 4 ++-- src/main/java/io/xpire/model/tag/Tag.java | 2 +- src/test/java/io/xpire/logic/commands/SearchCommandTest.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/xpire/model/item/ContainsKeywordsPredicate.java b/src/main/java/io/xpire/model/item/ContainsKeywordsPredicate.java index e6793a53729..1866c57003b 100644 --- a/src/main/java/io/xpire/model/item/ContainsKeywordsPredicate.java +++ b/src/main/java/io/xpire/model/item/ContainsKeywordsPredicate.java @@ -42,7 +42,7 @@ public boolean test(Item item) { tagsContainsKeywords = keyword.startsWith("#") && keyword.length() > 1 && new HashSet<>(stringifyCollection( - item.getTags(), tag -> tag.substring(1, tag.length() - 1)) + item.getTags(), tag -> tag.substring(1)) ) .contains(keyword.substring(1)); if (nameContainsKeywords || tagsContainsKeywords) { diff --git a/src/main/java/io/xpire/model/item/Item.java b/src/main/java/io/xpire/model/item/Item.java index 58426f5eba9..0d3be52068d 100644 --- a/src/main/java/io/xpire/model/item/Item.java +++ b/src/main/java/io/xpire/model/item/Item.java @@ -126,8 +126,8 @@ public String toString() { final StringBuilder builder = new StringBuilder(); builder.append(this.name.toString()); if (!this.getTags().isEmpty()) { - builder.append("\nTags: "); - this.getTags().forEach((builder::append)); + builder.append("\nTags:"); + this.getTags().forEach(tag -> builder.append(" " + tag)); } return builder.toString(); } diff --git a/src/main/java/io/xpire/model/item/XpireItem.java b/src/main/java/io/xpire/model/item/XpireItem.java index 460adf9b5b2..f9b67d39248 100644 --- a/src/main/java/io/xpire/model/item/XpireItem.java +++ b/src/main/java/io/xpire/model/item/XpireItem.java @@ -193,8 +193,8 @@ public String toString() { builder.append(this.name).append("\n") .append(String.format("Expiry date: %s\n", this.expiryDate.toStringWithCountdown())) .append(String.format("Quantity: %s\n", this.quantity)) - .append("Tags: "); - this.getTags().forEach(builder::append); + .append("Tags:"); + this.getTags().forEach(tag -> builder.append(" " + tag)); } else { builder.append(this.name).append("\n") .append(String.format("Expiry date: %s\n", this.expiryDate.toStringWithCountdown())) diff --git a/src/main/java/io/xpire/model/tag/Tag.java b/src/main/java/io/xpire/model/tag/Tag.java index 6fc46b4306f..cc7d53f8397 100644 --- a/src/main/java/io/xpire/model/tag/Tag.java +++ b/src/main/java/io/xpire/model/tag/Tag.java @@ -67,7 +67,7 @@ public int hashCode() { * Format state as text for viewing. */ public String toString() { - return "[" + this.tagName + "]"; + return "#" + this.tagName; } } diff --git a/src/test/java/io/xpire/logic/commands/SearchCommandTest.java b/src/test/java/io/xpire/logic/commands/SearchCommandTest.java index 2dc7ee33af8..b2dca2a8c01 100644 --- a/src/test/java/io/xpire/logic/commands/SearchCommandTest.java +++ b/src/test/java/io/xpire/logic/commands/SearchCommandTest.java @@ -109,7 +109,7 @@ public void execute_allMatchingKeywords_someItemsFoundNoRecommendations() { @Test public void execute_allMatchingKeywords_someItemsFoundWithRecommendations() { String expectedMessage = String.format(MESSAGE_ITEMS_LISTED_OVERVIEW, 0) - + String.format(MESSAGE_SUGGESTIONS, "[[Fridge]]") + + String.format(MESSAGE_SUGGESTIONS, "[#Fridge]") + String.format(MESSAGE_SUGGESTIONS, "[Banana]"); ContainsKeywordsPredicate predicate = preparePredicate("Banaan|#Fridg"); SearchCommand command = new SearchCommand(XPIRE, predicate); From 89a8b0b21ef65e129b331529149de5f100b41f07 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 10 Nov 2019 03:54:42 +0800 Subject: [PATCH 4/7] Update search and xpire parser tests --- .../logic/parser/SearchCommandParserTest.java | 1 + .../xpire/logic/parser/XpireParserTest.java | 97 ++++++++++++------- 2 files changed, 64 insertions(+), 34 deletions(-) diff --git a/src/test/java/io/xpire/logic/parser/SearchCommandParserTest.java b/src/test/java/io/xpire/logic/parser/SearchCommandParserTest.java index d83dbd03383..4aaddd0805b 100644 --- a/src/test/java/io/xpire/logic/parser/SearchCommandParserTest.java +++ b/src/test/java/io/xpire/logic/parser/SearchCommandParserTest.java @@ -12,6 +12,7 @@ import io.xpire.logic.commands.SearchCommand; import io.xpire.model.item.ContainsKeywordsPredicate; +//@@author JermyTan public class SearchCommandParserTest { private SearchCommandParser parser = new SearchCommandParser(XPIRE); diff --git a/src/test/java/io/xpire/logic/parser/XpireParserTest.java b/src/test/java/io/xpire/logic/parser/XpireParserTest.java index 223c4d0c845..b5bea496469 100644 --- a/src/test/java/io/xpire/logic/parser/XpireParserTest.java +++ b/src/test/java/io/xpire/logic/parser/XpireParserTest.java @@ -2,13 +2,11 @@ import static io.xpire.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static io.xpire.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; -import static io.xpire.model.ListType.XPIRE; import static io.xpire.testutil.Assert.assertThrows; import static io.xpire.testutil.TypicalIndexes.INDEX_FIRST_ITEM; import static io.xpire.testutil.TypicalItemsFields.VALID_EXPIRY_DATE_KIWI; import static io.xpire.testutil.TypicalItemsFields.VALID_NAME_KIWI; import static io.xpire.testutil.TypicalItemsFields.VALID_TAG_DRINK; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; @@ -21,6 +19,7 @@ import io.xpire.logic.commands.ClearCommand; import io.xpire.logic.commands.DeleteCommand; import io.xpire.logic.commands.ExitCommand; +import io.xpire.logic.commands.ExportCommand; import io.xpire.logic.commands.HelpCommand; import io.xpire.logic.commands.SearchCommand; import io.xpire.logic.commands.SetReminderCommand; @@ -28,90 +27,120 @@ import io.xpire.logic.commands.TagCommand; import io.xpire.logic.commands.ViewCommand; import io.xpire.logic.parser.exceptions.ParseException; -import io.xpire.model.item.ContainsKeywordsPredicate; -import io.xpire.model.item.Quantity; +//@@author JermyTan public class XpireParserTest { private final XpireParser parser = new XpireParser(); @Test - public void parse_add() throws Exception { + public void parse_add() throws ParseException { assertTrue(parser.parse(AddCommand.COMMAND_WORD + "|" + VALID_NAME_KIWI + "|" + VALID_EXPIRY_DATE_KIWI) instanceof AddCommand); + assertTrue(parser.parse(AddCommand.COMMAND_SHORTHAND + "|" + VALID_NAME_KIWI + + "|" + VALID_EXPIRY_DATE_KIWI) instanceof AddCommand); } @Test - public void parse_check() throws Exception { + public void parse_check() throws ParseException { assertTrue(parser.parse(CheckCommand.COMMAND_WORD) instanceof CheckCommand); + assertTrue(parser.parse(CheckCommand.COMMAND_SHORTHAND) instanceof CheckCommand); assertTrue(parser.parse(CheckCommand.COMMAND_WORD + "|5") instanceof CheckCommand); + assertTrue(parser.parse(CheckCommand.COMMAND_SHORTHAND + "|5") instanceof CheckCommand); } @Test - public void parse_clear() throws Exception { + public void parse_clear() throws ParseException { assertTrue(parser.parse(ClearCommand.COMMAND_WORD) instanceof ClearCommand); - assertTrue(parser.parse(ClearCommand.COMMAND_WORD + "|3") instanceof ClearCommand); + assertTrue(parser.parse(ClearCommand.COMMAND_SHORTHAND) instanceof ClearCommand); + assertTrue(parser.parse(ClearCommand.COMMAND_WORD + "|any random input") instanceof ClearCommand); + assertTrue(parser.parse(ClearCommand.COMMAND_SHORTHAND + "|any random") instanceof ClearCommand); } @Test - public void parse_delete() throws Exception { + public void parse_delete() throws ParseException { //delete item - DeleteCommand deleteItemCommand = (DeleteCommand) parser.parse( - DeleteCommand.COMMAND_WORD + "|" + INDEX_FIRST_ITEM.getOneBased()); - assertEquals(new DeleteCommand(XPIRE, INDEX_FIRST_ITEM), deleteItemCommand); + assertTrue(parser.parse(DeleteCommand.COMMAND_WORD + "|" + + INDEX_FIRST_ITEM.getOneBased()) instanceof DeleteCommand); + assertTrue(parser.parse(DeleteCommand.COMMAND_SHORTHAND + "|" + + INDEX_FIRST_ITEM.getOneBased()) instanceof DeleteCommand); //delete quantity - DeleteCommand deleteQuantityCommand = (DeleteCommand) parser.parse( - DeleteCommand.COMMAND_WORD + "|" + INDEX_FIRST_ITEM.getOneBased() + "|1"); - assertEquals(new DeleteCommand(XPIRE, INDEX_FIRST_ITEM, new Quantity("1")), deleteQuantityCommand); + assertTrue(parser.parse(DeleteCommand.COMMAND_WORD + "|" + + INDEX_FIRST_ITEM.getOneBased() + "|1") instanceof DeleteCommand); + assertTrue(parser.parse(DeleteCommand.COMMAND_SHORTHAND + "|" + + INDEX_FIRST_ITEM.getOneBased() + "|1") instanceof DeleteCommand); } @Test - public void parse_exit() throws Exception { + public void parse_exit() throws ParseException { assertTrue(parser.parse(ExitCommand.COMMAND_WORD) instanceof ExitCommand); + assertTrue(parser.parse(ExitCommand.COMMAND_SHORTHAND) instanceof ExitCommand); assertTrue(parser.parse(ExitCommand.COMMAND_WORD + "|3") instanceof ExitCommand); + assertTrue(parser.parse(ExitCommand.COMMAND_SHORTHAND + "|3") instanceof ExitCommand); } @Test - public void parse_help() throws Exception { + public void parse_help() throws ParseException { assertTrue(parser.parse(HelpCommand.COMMAND_WORD) instanceof HelpCommand); + assertTrue(parser.parse(HelpCommand.COMMAND_SHORTHAND) instanceof HelpCommand); assertTrue(parser.parse(HelpCommand.COMMAND_WORD + "|3") instanceof HelpCommand); + assertTrue(parser.parse(HelpCommand.COMMAND_SHORTHAND + "|3") instanceof HelpCommand); + } @Test - public void parse_search() throws Exception { + public void parse_search() throws ParseException { List keywords = Arrays.asList("foo", "bar", "baz"); - SearchCommand command = (SearchCommand) parser.parse( - SearchCommand.COMMAND_WORD + "|" + String.join("|", keywords)); - assertEquals(new SearchCommand(XPIRE, new ContainsKeywordsPredicate(keywords)), command); + assertTrue(parser.parse(SearchCommand.COMMAND_WORD + "|" + + String.join("|", keywords)) instanceof SearchCommand); + assertTrue(parser.parse(SearchCommand.COMMAND_SHORTHAND + "|" + + String.join("|", keywords)) instanceof SearchCommand); + } @Test - public void parse_setReminder() throws Exception { - assertTrue(parser.parse(SetReminderCommand.COMMAND_WORD - + "|" + INDEX_FIRST_ITEM.getOneBased() - + "|10") instanceof SetReminderCommand); + public void parse_setReminder() throws ParseException { + assertTrue(parser.parse(SetReminderCommand.COMMAND_WORD + "|" + + INDEX_FIRST_ITEM.getOneBased() + "|10") instanceof SetReminderCommand); + assertTrue(parser.parse(SetReminderCommand.COMMAND_SHORTHAND + "|" + + INDEX_FIRST_ITEM.getOneBased() + "|10") instanceof SetReminderCommand); + } @Test - public void parse_sort() throws Exception { - assertTrue(parser.parse(SortCommand.COMMAND_WORD - + "|name") instanceof SortCommand); - assertTrue(parser.parse(SortCommand.COMMAND_WORD - + "|date") instanceof SortCommand); + public void parse_sort() throws ParseException { + assertTrue(parser.parse(SortCommand.COMMAND_WORD + "|name") instanceof SortCommand); + assertTrue(parser.parse(SortCommand.COMMAND_SHORTHAND + "|name") instanceof SortCommand); + assertTrue(parser.parse(SortCommand.COMMAND_WORD + "|date") instanceof SortCommand); + assertTrue(parser.parse(SortCommand.COMMAND_SHORTHAND + "|date") instanceof SortCommand); } @Test - public void parse_tag() throws Exception { + public void parse_tag() throws ParseException { assertTrue(parser.parse(TagCommand.COMMAND_WORD) instanceof TagCommand); - assertTrue(parser.parse(TagCommand.COMMAND_WORD + "|1|#" - + VALID_TAG_DRINK) instanceof TagCommand); + assertTrue(parser.parse(TagCommand.COMMAND_SHORTHAND) instanceof TagCommand); + assertTrue(parser.parse(TagCommand.COMMAND_WORD + "|1|#" + VALID_TAG_DRINK) instanceof TagCommand); + assertTrue(parser.parse(TagCommand.COMMAND_SHORTHAND + "|1|#" + VALID_TAG_DRINK) instanceof TagCommand); + } @Test - public void parse_view() throws Exception { + public void parse_view() throws ParseException { assertTrue(parser.parse(ViewCommand.COMMAND_WORD) instanceof ViewCommand); + assertTrue(parser.parse(ViewCommand.COMMAND_SHORTHAND) instanceof ViewCommand); + assertTrue(parser.parse(ViewCommand.COMMAND_WORD + "|main") instanceof ViewCommand); + assertTrue(parser.parse(ViewCommand.COMMAND_SHORTHAND + "|main") instanceof ViewCommand); assertTrue(parser.parse(ViewCommand.COMMAND_WORD + "|replenish") instanceof ViewCommand); + assertTrue(parser.parse(ViewCommand.COMMAND_SHORTHAND + "|replenish") instanceof ViewCommand); + } + + @Test + public void parse_export() throws ParseException { + assertTrue(parser.parse(ExportCommand.COMMAND_WORD) instanceof ExportCommand); + assertTrue(parser.parse(ExportCommand.COMMAND_SHORTHAND) instanceof ExportCommand); + assertTrue(parser.parse(ExportCommand.COMMAND_WORD + "|any random input") instanceof ExportCommand); + assertTrue(parser.parse(ExportCommand.COMMAND_SHORTHAND + "|any random input") instanceof ExportCommand); } @Test From 4db6a7511653ae751cf80ab11259ad38e76c2186 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 10 Nov 2019 04:36:43 +0800 Subject: [PATCH 5/7] Add export command tests --- .../xpire/logic/commands/ExportCommand.java | 13 +++- .../logic/commands/ExportCommandTest.java | 59 +++++++++++++++++++ .../java/io/xpire/model/ModelManagerTest.java | 20 +++++-- 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/test/java/io/xpire/logic/commands/ExportCommandTest.java diff --git a/src/main/java/io/xpire/logic/commands/ExportCommand.java b/src/main/java/io/xpire/logic/commands/ExportCommand.java index 01d36ebe717..b93c5d8abdb 100644 --- a/src/main/java/io/xpire/logic/commands/ExportCommand.java +++ b/src/main/java/io/xpire/logic/commands/ExportCommand.java @@ -25,10 +25,10 @@ public class ExportCommand extends Command { public static final String SHOWING_EXPORT_MESSAGE = "QR code generated."; /** Pretty formatting of the exported data. */ - private static final String BORDER = "* * * * * * * * * * * * * * * * * * * * * * * * *\n"; + public static final String BORDER = "* * * * * * * * * * * * * * * * * * * * * * * * *\n"; /** Resolution size of the QR code image. */ - private static final int RESOLUTION_SIZE = 800; + public static final int RESOLUTION_SIZE = 800; @Override public CommandResult execute(Model model, StateManager stateManager) throws CommandException { @@ -44,4 +44,13 @@ public CommandResult execute(Model model, StateManager stateManager) throws Comm byte[] pngData = StringUtil.getQrCode(formattedOutput.toString(), RESOLUTION_SIZE); return new CommandResult(SHOWING_EXPORT_MESSAGE, true, pngData); } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else { + return obj instanceof ExportCommand; + } + } } diff --git a/src/test/java/io/xpire/logic/commands/ExportCommandTest.java b/src/test/java/io/xpire/logic/commands/ExportCommandTest.java new file mode 100644 index 00000000000..ee57988430b --- /dev/null +++ b/src/test/java/io/xpire/logic/commands/ExportCommandTest.java @@ -0,0 +1,59 @@ +package io.xpire.logic.commands; + +import static io.xpire.commons.core.Messages.MESSAGE_EMPTY_LIST; +import static io.xpire.logic.commands.ExportCommand.BORDER; +import static io.xpire.logic.commands.ExportCommand.RESOLUTION_SIZE; +import static io.xpire.logic.commands.ExportCommand.SHOWING_EXPORT_MESSAGE; +import static io.xpire.model.ListType.REPLENISH; +import static io.xpire.testutil.TypicalItems.getTypicalLists; + +import org.junit.jupiter.api.Test; + +import io.xpire.commons.util.StringUtil; +import io.xpire.model.Model; +import io.xpire.model.ModelManager; +import io.xpire.model.UserPrefs; +import io.xpire.model.item.Item; +import javafx.collections.ObservableList; + +//@@author JermyTan +public class ExportCommandTest { + @Test + public void execute_emptyLists_failure() { + Model model = new ModelManager(); + + CommandTestUtil.assertCommandFailure(new ExportCommand(), model, MESSAGE_EMPTY_LIST); + } + + @Test + public void execute_nonEmptyXpire_success() { + Model model = new ModelManager(getTypicalLists(), new UserPrefs()); + Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); + + CommandTestUtil.assertCommandSuccess(new ExportCommand(), model, + new CommandResult(SHOWING_EXPORT_MESSAGE, true, this.getPngData(model)), expectedModel); + } + + @Test + public void execute_nonEmptyReplenishList_success() { + Model model = new ModelManager(getTypicalLists(), new UserPrefs()); + Model expectedModel = new ModelManager(getTypicalLists(), new UserPrefs()); + model.setCurrentList(REPLENISH); + expectedModel.setCurrentList(REPLENISH); + + CommandTestUtil.assertCommandSuccess(new ExportCommand(), model, + new CommandResult(SHOWING_EXPORT_MESSAGE, true, this.getPngData(model)), expectedModel); + } + + private byte[] getPngData(Model model) { + ObservableList currentList = model.getCurrentList(); + StringBuilder formattedOutput = new StringBuilder(BORDER); + for (int index = 1; index <= currentList.size(); index++) { + formattedOutput.append(String.format("%d. %s\n", index, currentList.get(index - 1).toString())); + formattedOutput.append(BORDER); + } + + byte[] pngData = StringUtil.getQrCode(formattedOutput.toString(), RESOLUTION_SIZE); + return pngData; + } +} diff --git a/src/test/java/io/xpire/model/ModelManagerTest.java b/src/test/java/io/xpire/model/ModelManagerTest.java index 81b9cef18f8..3426f79f99d 100644 --- a/src/test/java/io/xpire/model/ModelManagerTest.java +++ b/src/test/java/io/xpire/model/ModelManagerTest.java @@ -1,5 +1,6 @@ package io.xpire.model; +import static io.xpire.model.ListType.REPLENISH; import static io.xpire.model.ListType.XPIRE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -64,12 +65,12 @@ public void setGuiSettings_validGuiSettings_setsGuiSettings() { } @Test - public void setExpiryDateTrackerFilePath_nullPath_throwsNullPointerException() { + public void setXpireFilePath_nullPath_throwsNullPointerException() { Assert.assertThrows(NullPointerException.class, () -> this.modelManager.setListFilePath(null)); } @Test - public void setExpiryDateTrackerFilePath_validPath_setsAddressBookFilePath() { + public void setXpireFilePath_validPath_setsXpireFilePath() { Path path = Paths.get("xpire/io/file/path"); this.modelManager.setListFilePath(path); assertEquals(path, this.modelManager.getListFilePath()); @@ -81,18 +82,18 @@ public void hasItem_nullItem_throwsNullPointerException() { } @Test - public void hasItem_itemNotInAddressBook_returnsFalse() { + public void hasItem_itemNotInXpire_returnsFalse() { assertFalse(this.modelManager.hasItem(XPIRE, TypicalItems.KIWI)); } @Test - public void hasItem_itemInAddressBook_returnsTrue() { + public void hasItem_itemInXpire_returnsTrue() { this.modelManager.addItem(XPIRE, TypicalItems.KIWI); assertTrue(this.modelManager.hasItem(XPIRE, TypicalItems.KIWI)); } @Test - public void getFilteredItemList_modifyList_throwsUnsupportedOperationException() { + public void getCurrentList_modifyList_throwsUnsupportedOperationException() { Assert.assertThrows(UnsupportedOperationException.class, () -> this.modelManager .getCurrentList().remove(0)); } @@ -132,13 +133,20 @@ public void equals() { // different xpire -> returns false assertNotEquals(this.modelManager, new ModelManager(differentLists, userPrefs)); + // different view -> returns false + this.modelManager.setCurrentList(REPLENISH); + assertNotEquals(this.modelManager, new ModelManager(lists, userPrefs)); + + // sets modelManager back to viewing Xpire list. + this.modelManager.setCurrentList(XPIRE); + // different filteredList -> returns false String[] keywords = TypicalItems.KIWI.getName().toString().split("\\s+"); this.modelManager.filterCurrentList(XPIRE, new ContainsKeywordsPredicate(Arrays.asList(keywords))); assertNotEquals(this.modelManager, new ModelManager(lists, userPrefs)); // resets modelManager to initial state for upcoming tests - this.modelManager.setCurrentList(XPIRE); + this.modelManager = new ModelManager(); // different userPrefs -> returns false UserPrefs differentUserPrefs = new UserPrefs(); From cac266028f0610d643eb455ee82b4ad8df126bce Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 10 Nov 2019 05:53:21 +0800 Subject: [PATCH 6/7] Add testing for DateUtil --- .../java/io/xpire/commons/util/DateUtil.java | 1 + .../io/xpire/commons/util/DateUtilTest.java | 203 ++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 src/test/java/io/xpire/commons/util/DateUtilTest.java diff --git a/src/main/java/io/xpire/commons/util/DateUtil.java b/src/main/java/io/xpire/commons/util/DateUtil.java index e804caaf5e6..57223488dbb 100644 --- a/src/main/java/io/xpire/commons/util/DateUtil.java +++ b/src/main/java/io/xpire/commons/util/DateUtil.java @@ -89,6 +89,7 @@ public static long getOffsetDays(LocalDate earlierDate, LocalDate laterDate) { */ public static LocalDate getPreviousDate(LocalDate date, int offsetDays) { requireNonNull(date); + AppUtil.checkArgument(offsetDays >= 0); return date.minusDays(offsetDays); } diff --git a/src/test/java/io/xpire/commons/util/DateUtilTest.java b/src/test/java/io/xpire/commons/util/DateUtilTest.java new file mode 100644 index 00000000000..511fa4121d1 --- /dev/null +++ b/src/test/java/io/xpire/commons/util/DateUtilTest.java @@ -0,0 +1,203 @@ +package io.xpire.commons.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.time.LocalDate; + +import org.junit.jupiter.api.Test; + +import io.xpire.testutil.Assert; + +public class DateUtilTest { + + @Test + public void convertDateToString_nullDate_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> DateUtil.convertDateToString(null)); + } + + @Test + public void convertDateToString_validDate_dateInString() { + // typical date + assertEquals("25/12/2019", DateUtil.convertDateToString(LocalDate.of(2019, 12, 25))); + + // date with single digit month and day + assertEquals("1/9/2019", DateUtil.convertDateToString(LocalDate.of(2019, 9, 1))); + + // leap year + assertEquals("29/2/2020", DateUtil.convertDateToString(LocalDate.of(2020, 2, 29))); + } + + @Test + public void convertStringToDate_nullString_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> DateUtil.convertStringToDate(null)); + } + + @Test + public void convertStringToDate_invalidString_null() { + // empty string + assertNull(DateUtil.convertStringToDate("")); + + // incorrect format + assertNull(DateUtil.convertStringToDate("1")); + + // contains letters + assertNull(DateUtil.convertStringToDate("1/12/a2019")); + + // invalid days + assertNull(DateUtil.convertStringToDate("33/5/2019")); + assertNull(DateUtil.convertStringToDate("0/5/2019")); + assertNull(DateUtil.convertStringToDate("-3/5/2019")); + + // invalid months + assertNull(DateUtil.convertStringToDate("25/13/2019")); + assertNull(DateUtil.convertStringToDate("25/0/2019")); + assertNull(DateUtil.convertStringToDate("25/-2/2019")); + + // invalid years + assertNull(DateUtil.convertStringToDate("25/2/002019")); + assertNull(DateUtil.convertStringToDate("25/2/10000")); + assertNull(DateUtil.convertStringToDate("25/2/0")); + assertNull(DateUtil.convertStringToDate("25/2/-2")); + + //******************* invalid dates edge cases *******************// + // non-leap year + assertNull(DateUtil.convertStringToDate("29/2/2019")); + + // invalid days for february + assertNull(DateUtil.convertStringToDate("30/2/2019")); + assertNull(DateUtil.convertStringToDate("31/2/2019")); + + // non 31-days months + assertNull(DateUtil.convertStringToDate("31/4/2019")); + assertNull(DateUtil.convertStringToDate("31/6/2019")); + assertNull(DateUtil.convertStringToDate("31/9/2019")); + assertNull(DateUtil.convertStringToDate("31/11/2019")); + } + + @Test + public void convertStringToDate_validString_localDate() { + // typical date (without zero padded) + assertEquals(LocalDate.of(2019, 8, 1), DateUtil.convertStringToDate("1/8/2019")); + assertEquals(LocalDate.of(2019, 12, 25), DateUtil.convertStringToDate("25/12/2019")); + + // typical date (with zero padded) + assertEquals(LocalDate.of(2019, 8, 1), DateUtil.convertStringToDate("01/08/2019")); + + // typical date (with excessive zero padded) + assertEquals(LocalDate.of(2019, 8, 1), DateUtil.convertStringToDate("0001/0008/2019")); + assertEquals(LocalDate.of(2019, 12, 25), DateUtil.convertStringToDate("00025/00012/2019")); + + // leap year + assertEquals(LocalDate.of(2020, 2, 29), DateUtil.convertStringToDate("29/2/2020")); + + // 31-days months + assertEquals(LocalDate.of(2019, 1, 31), DateUtil.convertStringToDate("31/1/2019")); + assertEquals(LocalDate.of(2019, 3, 31), DateUtil.convertStringToDate("31/3/2019")); + assertEquals(LocalDate.of(2019, 5, 31), DateUtil.convertStringToDate("31/5/2019")); + assertEquals(LocalDate.of(2019, 7, 31), DateUtil.convertStringToDate("31/7/2019")); + assertEquals(LocalDate.of(2019, 8, 31), DateUtil.convertStringToDate("31/8/2019")); + assertEquals(LocalDate.of(2019, 10, 31), DateUtil.convertStringToDate("31/10/2019")); + assertEquals(LocalDate.of(2019, 12, 31), DateUtil.convertStringToDate("31/12/2019")); + } + + @Test + public void isWithinRange_nullDates_throwsNullPointerException() { + // both dates are null + Assert.assertThrows(NullPointerException.class, () -> DateUtil.isWithinRange(1, null, null)); + // earlier date is null + Assert.assertThrows(NullPointerException.class, () -> DateUtil.isWithinRange(1, LocalDate.now(), null)); + // later date is null + Assert.assertThrows(NullPointerException.class, () -> DateUtil.isWithinRange(1, null, LocalDate.now())); + } + + @Test + public void isWithinRange_negativeDays_throwsIllegalArgumentException() { + Assert.assertThrows(IllegalArgumentException.class, () -> DateUtil.isWithinRange(-1, LocalDate.now(), LocalDate.now())); + } + + @Test + public void isWithinRange_earlierDateIsAfterLaterDate_true() { + LocalDate earlierDate = LocalDate.now(); + LocalDate laterDate = earlierDate.minusDays(10); + assertTrue(DateUtil.isWithinRange(1, earlierDate, laterDate)); + } + + @Test + public void isWithinRange_daysWithinRange_true() { + LocalDate earlierDate = LocalDate.now(); + LocalDate laterDate = earlierDate.plusDays(5); + + // just nice within range + assertTrue(DateUtil.isWithinRange(5, earlierDate, laterDate)); + // within range + assertTrue(DateUtil.isWithinRange(6, earlierDate, laterDate)); + } + + @Test + public void isWithinRange_daysNotWithinRange_false() { + LocalDate earlierDate = LocalDate.now(); + LocalDate laterDate = earlierDate.plusDays(5); + + // just nice not within range + assertFalse(DateUtil.isWithinRange(4, earlierDate, laterDate)); + // not within range + assertFalse(DateUtil.isWithinRange(2, earlierDate, laterDate)); + } + + @Test + public void getOffsetDays_nullDates_throwsNullPointerException() { + // both dates are null + Assert.assertThrows(NullPointerException.class, () -> DateUtil.getOffsetDays(null, null)); + // earlierDate is null + Assert.assertThrows(NullPointerException.class, () -> DateUtil.getOffsetDays(LocalDate.now(), null)); + // laterDate is null + Assert.assertThrows(NullPointerException.class, () -> DateUtil.getOffsetDays(null, LocalDate.now())); + } + + @Test + public void getOffsetDays_sameDate_zero() { + assertEquals(0, DateUtil.getOffsetDays(LocalDate.now(), LocalDate.now())); + } + + @Test + public void getOffsetDays_earlierDateIsAfterLaterDate_negativeNumber() { + LocalDate earlierDate = LocalDate.now(); + LocalDate laterDate = earlierDate.minusDays(5); + assertEquals(-5, DateUtil.getOffsetDays(earlierDate, laterDate)); + } + + @Test + public void getOffsetDays_earlierDateIsBeforeLaterDate_positiveNumber() { + LocalDate earlierDate = LocalDate.now(); + LocalDate laterDate = earlierDate.plusDays(5); + assertEquals(5, DateUtil.getOffsetDays(earlierDate, laterDate)); + } + + @Test + public void getPreviousDate_nullDate_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> DateUtil.getPreviousDate(null, 1)); + } + + @Test + public void getPreviousDate_negativeOffsetDays_throwsIllegalArgumentException() { + Assert.assertThrows(IllegalArgumentException.class, () -> DateUtil.getPreviousDate(LocalDate.now(), -1)); + } + + @Test + public void getPreviousDate_zeroOffsetDay_sameDate() { + assertEquals(LocalDate.now(), DateUtil.getPreviousDate(LocalDate.now(), 0)); + } + + @Test + public void getPreviousDate_positiveOffsetDays_earlierDate() { + assertEquals(LocalDate.now().minusDays(5), DateUtil.getPreviousDate(LocalDate.now(), 5)); + } + + @Test + public void getCurrentDate() { + assertEquals(LocalDate.now(), DateUtil.getCurrentDate()); + } +} From 09a37fc8fdd0aeecc3341c120446522c4bc2eddb Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 10 Nov 2019 05:59:33 +0800 Subject: [PATCH 7/7] Fix checkstyle --- src/test/java/io/xpire/commons/util/DateUtilTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/io/xpire/commons/util/DateUtilTest.java b/src/test/java/io/xpire/commons/util/DateUtilTest.java index 511fa4121d1..bf70d0673d3 100644 --- a/src/test/java/io/xpire/commons/util/DateUtilTest.java +++ b/src/test/java/io/xpire/commons/util/DateUtilTest.java @@ -115,7 +115,8 @@ public void isWithinRange_nullDates_throwsNullPointerException() { @Test public void isWithinRange_negativeDays_throwsIllegalArgumentException() { - Assert.assertThrows(IllegalArgumentException.class, () -> DateUtil.isWithinRange(-1, LocalDate.now(), LocalDate.now())); + Assert.assertThrows(IllegalArgumentException.class, () -> DateUtil + .isWithinRange(-1, LocalDate.now(), LocalDate.now())); } @Test