From 103d9aa2678c7854b92d7d3333081efc3327e579 Mon Sep 17 00:00:00 2001 From: MC Date: Thu, 7 Nov 2019 14:43:36 +0800 Subject: [PATCH 1/2] Adding Parser Tests and Storage --- .../editcommands/EditBudgetCommand.java | 3 +- .../editcommands/EditCategoryCommand.java | 12 +- .../editcommands/EditExpenseCommand.java | 5 +- .../java/seedu/guilttrip/model/GuiltTrip.java | 1 + .../model/entry/AutoExpenseList.java | 9 - .../guilttrip/model/entry/BudgetList.java | 7 - .../guilttrip/model/entry/ExpenseList.java | 7 - .../guilttrip/model/entry/IncomeList.java | 9 - .../seedu/guilttrip/model/entry/WishList.java | 9 - .../storage/JsonAdaptedCategory.java | 8 + .../logic/commands/CommandTestUtil.java | 11 + .../logic/parser/CommandParserTestUtil.java | 1 + .../DeleteCategoryCommandParserTest.java | 33 +++ .../parser/EditCategoryCommandParserTest.java | 255 ++++++------------ .../storage/JsonAdaptedCategoryTest.java | 61 +++++ 15 files changed, 205 insertions(+), 226 deletions(-) create mode 100644 src/test/java/seedu/guilttrip/logic/parser/DeleteCategoryCommandParserTest.java create mode 100644 src/test/java/seedu/guilttrip/storage/JsonAdaptedCategoryTest.java diff --git a/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditBudgetCommand.java b/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditBudgetCommand.java index 32eba2a8420..801dbbb8df9 100644 --- a/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditBudgetCommand.java +++ b/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditBudgetCommand.java @@ -51,7 +51,8 @@ public class EditBudgetCommand extends Command { public static final String MESSAGE_EDIT_ENTRY_SUCCESS = "Edited Budget: %1$s"; public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided."; - public static final String MESSAGE_DUPLICATE_ENTRY = "This entry already exists in the guilttrip book."; + public static final String MESSAGE_DUPLICATE_ENTRY = "There is no change in the entry that you are editing." + + ""; private final Index index; private final EditBudgetDescriptor editEntryDescriptor; diff --git a/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditCategoryCommand.java b/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditCategoryCommand.java index 79ad7bb78a8..c24f88ce2de 100644 --- a/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditCategoryCommand.java +++ b/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditCategoryCommand.java @@ -3,6 +3,7 @@ import static java.util.Objects.requireNonNull; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_CATEGORY; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_DESC; +import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_OLD_NAME; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_TYPE; import javafx.collections.ObservableList; @@ -24,12 +25,12 @@ public class EditCategoryCommand extends Command { + "by the name of the Category as well as the type of category whether it is expense or income. " + "Existing values will be overwritten by the input values.\n" + "Parameters: " - + PREFIX_TYPE + "TYPE OF CATEGORY " - + PREFIX_CATEGORY + "CATEGORY NAME " + + PREFIX_CATEGORY + "TYPE OF CATEGORY " + + PREFIX_OLD_NAME + "CATEGORY OLD NAME " + PREFIX_DESC + "NEW NAME FOR CATEGORY " + "Example: " + COMMAND_WORD + " " - + PREFIX_TYPE + "Expense " - + PREFIX_CATEGORY + "Food " + + PREFIX_CATEGORY + "Expense " + + PREFIX_OLD_NAME + "Food " + PREFIX_DESC + "Food And Drink "; public static final String MESSAGE_EDIT_ENTRY_SUCCESS = "Edited Category: %1$s"; @@ -158,9 +159,8 @@ public boolean equals(Object other) { // state check EditCategoryDescriptor e = (EditCategoryDescriptor) other; - return getCategoryName().equals(e.getCategoryName()) - && getCategoryType().equals(e.getCategoryType()); + && getCategoryType().equalsIgnoreCase(e.getCategoryType()); } } } diff --git a/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditExpenseCommand.java b/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditExpenseCommand.java index c91ccfcccc5..1fe869e95db 100644 --- a/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditExpenseCommand.java +++ b/src/main/java/seedu/guilttrip/logic/commands/editcommands/EditExpenseCommand.java @@ -51,7 +51,7 @@ public class EditExpenseCommand extends Command { public static final String MESSAGE_EDIT_ENTRY_SUCCESS = "Edited Expense: %1$s"; public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided."; - public static final String MESSAGE_DUPLICATE_ENTRY = "This expense already exists in guiltTrip."; + public static final String MESSAGE_DUPLICATE_ENTRY = "There is no change in the entry that you are editing."; private final Index index; private final EditExpenseDescriptor editEntryDescriptor; @@ -80,10 +80,9 @@ public CommandResult execute(Model model, CommandHistory history) throws Command Expense entryToEdit = lastShownList.get(index.getZeroBased()); Expense editedEntry = createEditedExpense(entryToEdit, editEntryDescriptor); - if (!entryToEdit.isSameEntry(editedEntry) && model.hasExpense(editedEntry)) { + if (entryToEdit.isSameEntry(editedEntry) && model.hasExpense(editedEntry)) { throw new CommandException(MESSAGE_DUPLICATE_ENTRY); } - System.out.println(editedEntry.toString()); model.setExpense(entryToEdit, editedEntry); model.updateFilteredExpenses(PREDICATE_SHOW_ALL_ENTRIES); model.commitAddressBook(); diff --git a/src/main/java/seedu/guilttrip/model/GuiltTrip.java b/src/main/java/seedu/guilttrip/model/GuiltTrip.java index f791914dc67..8bb26ca126f 100644 --- a/src/main/java/seedu/guilttrip/model/GuiltTrip.java +++ b/src/main/java/seedu/guilttrip/model/GuiltTrip.java @@ -478,6 +478,7 @@ public void setBudget(Budget target, Budget editedEntry) { indicateModified(); } + /** * Replaces the given reminder {@code target} in the list with {@code editedTracker}. * {@code target} must exist in the guilttrip book. diff --git a/src/main/java/seedu/guilttrip/model/entry/AutoExpenseList.java b/src/main/java/seedu/guilttrip/model/entry/AutoExpenseList.java index ae3f7f583bc..3e3814a8c79 100644 --- a/src/main/java/seedu/guilttrip/model/entry/AutoExpenseList.java +++ b/src/main/java/seedu/guilttrip/model/entry/AutoExpenseList.java @@ -54,16 +54,7 @@ public void add(AutoExpense toAdd) { */ public void setAutoExpense(AutoExpense target, AutoExpense editedAutoExpense) { requireAllNonNull(target, editedAutoExpense); - int index = internalList.indexOf(target); - if (index == -1) { - throw new EntryNotFoundException(); - } - - if (!target.equals(editedAutoExpense) && contains(editedAutoExpense)) { - throw new DuplicateEntryException(); - } - internalList.set(index, editedAutoExpense); } diff --git a/src/main/java/seedu/guilttrip/model/entry/BudgetList.java b/src/main/java/seedu/guilttrip/model/entry/BudgetList.java index 62bf59feb88..6d7ab7c07bc 100644 --- a/src/main/java/seedu/guilttrip/model/entry/BudgetList.java +++ b/src/main/java/seedu/guilttrip/model/entry/BudgetList.java @@ -53,13 +53,6 @@ public void setBudget(Budget target, Budget editedBudget) { requireAllNonNull(target, editedBudget); int index = internalList.indexOf(target); - if (index == -1) { - throw new EntryNotFoundException(); - } - - if (!target.equals(editedBudget) && contains(editedBudget)) { - throw new DuplicateEntryException(); - } internalList.set(index, editedBudget); } diff --git a/src/main/java/seedu/guilttrip/model/entry/ExpenseList.java b/src/main/java/seedu/guilttrip/model/entry/ExpenseList.java index 5e49d478544..c45fb899917 100644 --- a/src/main/java/seedu/guilttrip/model/entry/ExpenseList.java +++ b/src/main/java/seedu/guilttrip/model/entry/ExpenseList.java @@ -56,13 +56,6 @@ public void setExpense(Expense target, Expense editedExpense) { requireAllNonNull(target, editedExpense); int index = internalList.indexOf(target); - if (index == -1) { - throw new EntryNotFoundException(); - } - - if (!target.equals(editedExpense) && contains(editedExpense)) { - throw new DuplicateEntryException(); - } internalList.set(index, editedExpense); } diff --git a/src/main/java/seedu/guilttrip/model/entry/IncomeList.java b/src/main/java/seedu/guilttrip/model/entry/IncomeList.java index 1eecc2482b7..e54bf44ac00 100644 --- a/src/main/java/seedu/guilttrip/model/entry/IncomeList.java +++ b/src/main/java/seedu/guilttrip/model/entry/IncomeList.java @@ -53,16 +53,7 @@ public void add(Income toAdd) { */ public void setIncome(Income target, Income editedIncome) { requireAllNonNull(target, editedIncome); - int index = internalList.indexOf(target); - if (index == -1) { - throw new EntryNotFoundException(); - } - - if (!target.equals(editedIncome) && contains(editedIncome)) { - throw new DuplicateEntryException(); - } - internalList.set(index, editedIncome); } diff --git a/src/main/java/seedu/guilttrip/model/entry/WishList.java b/src/main/java/seedu/guilttrip/model/entry/WishList.java index 203b1ccbac1..bfdddf6043a 100644 --- a/src/main/java/seedu/guilttrip/model/entry/WishList.java +++ b/src/main/java/seedu/guilttrip/model/entry/WishList.java @@ -52,16 +52,7 @@ public void add(Wish toAdd) { */ public void setWish(Wish target, Wish editedWish) { requireAllNonNull(target, editedWish); - int index = internalList.indexOf(target); - if (index == -1) { - throw new EntryNotFoundException(); - } - - if (!target.equals(editedWish) && contains(editedWish)) { - throw new DuplicateEntryException(); - } - internalList.set(index, editedWish); } diff --git a/src/main/java/seedu/guilttrip/storage/JsonAdaptedCategory.java b/src/main/java/seedu/guilttrip/storage/JsonAdaptedCategory.java index a935bae0ade..bbbefa40e0b 100644 --- a/src/main/java/seedu/guilttrip/storage/JsonAdaptedCategory.java +++ b/src/main/java/seedu/guilttrip/storage/JsonAdaptedCategory.java @@ -13,6 +13,7 @@ class JsonAdaptedCategory { public static final String WRONG_CATEGORY_TYPE_MESSAGE_FORMAT = "Category Type of %s is not Income or Expense!"; + public static final String MISSING_FIELD_MESSAGE_FORMAT = "Category's %s field is missing!"; private final String categoryName; private final String categoryType; @@ -40,6 +41,13 @@ public JsonAdaptedCategory(Category source) { * @throws IllegalValueException if there were any data constraints violated in the adapted tag. */ public Category toModelType() throws IllegalValueException { + if (categoryName == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, "category Name")); + } + if (categoryType == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, "category Type")); + } + if (!Category.isValidCategoryType(categoryType)) { throw new IllegalValueException(String.format(WRONG_CATEGORY_TYPE_MESSAGE_FORMAT, categoryName)); } diff --git a/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java b/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java index e3400f2cf6d..e9fa78a6966 100644 --- a/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java @@ -5,6 +5,7 @@ import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_CATEGORY; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_DATE; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_DESC; +import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_OLD_NAME; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_TAG; import seedu.guilttrip.logic.CommandHistory; @@ -57,6 +58,10 @@ public class CommandTestUtil { public static final String VALID_CATEGORY_NAME_EXPENSE_FOOD = "food"; public static final String VALID_CATEGORY_NAME_EXPENSE_SHOPPING = "shopping"; public static final String VALID_CATEGORY_NAME_INCOME = "Business"; + //For Edit + public static final String VALID_NEW_CATEGORY_NAME = "learning"; + public static final String VALID_OLD_CATEGORY_NAME = "food"; + //Category related Test Utils. @@ -66,9 +71,15 @@ public class CommandTestUtil { public static final String CATEGORY_NAME_INCOME = " " + PREFIX_DESC + VALID_CATEGORY_NAME_INCOME; public static final String CATEGORY_NAME_EXPENSE_FOR_ENTRIES = " " + PREFIX_CATEGORY + VALID_CATEGORY_NAME_EXPENSE_FOOD; + //For Edit + public static final String CATEGORY_NAME_FOR_EDIT_NEW = " " + PREFIX_DESC + VALID_NEW_CATEGORY_NAME; + public static final String CATEGORY_NAME_FOR_EDIT_OLD = " " + PREFIX_OLD_NAME + VALID_OLD_CATEGORY_NAME; + public static final String INVALID_CATEGORY_NAME_FOR_EDIT_NEW = " " + PREFIX_DESC + VALID_OLD_CATEGORY_NAME; + public static final String INVALID_CATEGORY_TYPE_BUDGET = " " + PREFIX_CATEGORY + "Budget"; public static final String INVALID_CATEGORY_NAME = " " + PREFIX_DESC + "Alcohol"; + public static final String INVALID_CATEGORY_NAME_FOR_EDIT = " " + PREFIX_OLD_NAME + "Alcohol"; //Find related TestUtils. public static final String DESCRIPTION = "pgp cotton"; diff --git a/src/test/java/seedu/guilttrip/logic/parser/CommandParserTestUtil.java b/src/test/java/seedu/guilttrip/logic/parser/CommandParserTestUtil.java index cdca389e436..fadddbe1b66 100644 --- a/src/test/java/seedu/guilttrip/logic/parser/CommandParserTestUtil.java +++ b/src/test/java/seedu/guilttrip/logic/parser/CommandParserTestUtil.java @@ -17,6 +17,7 @@ public class CommandParserTestUtil { public static void assertParseSuccess(Parser parser, String userInput, Command expectedCommand) { try { Command command = parser.parse(userInput); + System.out.println(userInput); assertEquals(expectedCommand, command); } catch (ParseException pe) { throw new IllegalArgumentException("Invalid userInput.", pe); diff --git a/src/test/java/seedu/guilttrip/logic/parser/DeleteCategoryCommandParserTest.java b/src/test/java/seedu/guilttrip/logic/parser/DeleteCategoryCommandParserTest.java new file mode 100644 index 00000000000..407825002ba --- /dev/null +++ b/src/test/java/seedu/guilttrip/logic/parser/DeleteCategoryCommandParserTest.java @@ -0,0 +1,33 @@ +package seedu.guilttrip.logic.parser; + +import static seedu.guilttrip.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.guilttrip.logic.commands.CommandTestUtil.CATEGORY_NAME_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.CATEGORY_TYPE_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.INVALID_CATEGORY_TYPE_BUDGET; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_CATEGORY_TYPE_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_OLD_CATEGORY_NAME; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseSuccess; + +import org.junit.jupiter.api.Test; +import seedu.guilttrip.logic.commands.deletecommands.DeleteCategoryCommand; +import seedu.guilttrip.logic.parser.deletecommandparsers.DeleteCategoryCommandParser; +import seedu.guilttrip.model.entry.Category; + +public class DeleteCategoryCommandParserTest { + + private DeleteCategoryCommandParser parser = new DeleteCategoryCommandParser(); + + @Test + public void parse_validArgs_returnsDeleteCommand() { + assertParseSuccess(parser, CATEGORY_TYPE_EXPENSE + CATEGORY_NAME_EXPENSE, + new DeleteCategoryCommand(new Category(VALID_OLD_CATEGORY_NAME, VALID_CATEGORY_TYPE_EXPENSE))); + } + + @Test + public void parse_invalidArgs_throwsParseException() { + //Invalid Category Type + assertParseFailure(parser, INVALID_CATEGORY_TYPE_BUDGET + CATEGORY_NAME_EXPENSE, + Category.MESSAGE_CONSTRAINTS_TYPE); + } +} diff --git a/src/test/java/seedu/guilttrip/logic/parser/EditCategoryCommandParserTest.java b/src/test/java/seedu/guilttrip/logic/parser/EditCategoryCommandParserTest.java index fc74bfcae7d..bff48698347 100644 --- a/src/test/java/seedu/guilttrip/logic/parser/EditCategoryCommandParserTest.java +++ b/src/test/java/seedu/guilttrip/logic/parser/EditCategoryCommandParserTest.java @@ -1,175 +1,80 @@ -//package seedu.guilttrip.logic.parser; -// -//public class EditCategoryCommandParserTest { -// -// private static final String TAG_EMPTY = " " + PREFIX_TAG; -// -// private static final String MESSAGE_INVALID_FORMAT = -// String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditExpenseCommand.MESSAGE_USAGE); -// -// private EditExpenseCommandParser parser = new EditExpenseCommandParser(); -// -// @Test -// public void parse_missingParts_failure() { -// // no index specified -// assertParseFailure(parser, VALID_DESC_FOOD_EXPENSE, MESSAGE_INVALID_FORMAT); -// -// // no field specified -// assertParseFailure(parser, "1", EditExpenseCommand.MESSAGE_NOT_EDITED); -// -// // no index and no field specified -// assertParseFailure(parser, "", MESSAGE_INVALID_FORMAT); -// } -// -// @Test -// public void parse_invalidPreamble_failure() { -// // negative index -// assertParseFailure(parser, "-5" + NAME_DESC_FOOD_EXPENSE, MESSAGE_INVALID_FORMAT); -// -// // zero index -// assertParseFailure(parser, "0" + NAME_DESC_FOOD_EXPENSE, 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() { -// assertParseFailure(parser, "1" + INVALID_NAME_DESC, Description.MESSAGE_CONSTRAINTS); // invalid name -// assertParseFailure(parser, "1" + INVALID_AMOUNT, Amount.MESSAGE_CONSTRAINTS); // invalid phone -// assertParseFailure(parser, "1" + INVALID_DATE, Date.MESSAGE_CONSTRAINTS_FOR_ENTRIES); // invalid email -// assertParseFailure(parser, "1" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag -// -// // invalid description followed by valid date -// assertParseFailure(parser, "1" + INVALID_NAME_DESC + AMOUNT_FOOD_EXPENSE, -// Description.MESSAGE_CONSTRAINTS); -// -// // valid date followed by invalid tag. The test case for invalid phone followed by valid phone -// // is tested at {@code parse_invalidValueFollowedByValidValue_success()} -// assertParseFailure(parser, "1" + DATE_FOOD_EXPENSE + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); -// -// // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited, -// // parsing it together with a valid tag results in error -// assertParseFailure(parser, "1" + TAG_DESC_CLOTHING + TAG_DESC_FOOD + TAG_EMPTY, -// Tag.MESSAGE_CONSTRAINTS); -// assertParseFailure(parser, "1" + TAG_DESC_CLOTHING + TAG_EMPTY + TAG_DESC_FOOD, -// Tag.MESSAGE_CONSTRAINTS); -// assertParseFailure(parser, "1" + TAG_EMPTY + TAG_DESC_CLOTHING + TAG_DESC_FOOD, -// Tag.MESSAGE_CONSTRAINTS); -// -// // multiple invalid values, but only the first invalid value is captured -// assertParseFailure(parser, "1" + INVALID_NAME_DESC + INVALID_AMOUNT + INVALID_DATE + INVALID_TAG_DESC, -// Description.MESSAGE_CONSTRAINTS); -// } -// -// @Test -// public void parse_allFieldsSpecified_success() { -// Index targetIndex = INDEX_SECOND_ENTRY; -// String userInput = targetIndex.getOneBased() + NAME_DESC_FOOD_EXPENSE + TAG_DESC_WANT + TAG_DESC_FOOD -// + AMOUNT_FOOD_EXPENSE + DATE_FOOD_EXPENSE + CATEGORY_FOOD_EXPENSE; -// -// EditExpenseDescriptor descriptor = new EditExpenseDescriptorBuilder().withDescription(VALID_DESC_FOOD_EXPENSE) -// .withAmount(VALID_AMOUNT_FOOD_EXPENSE).withDate(VALID_DATE_FOOD_EXPENSE) -// .withCategory(VALID_CATEGORY_NAME_EXPENSE_FOOD).withTags(VALID_TAG_FOOD, VALID_TAG_CLOTHING_WANT) -// .build(); -// EditExpenseCommand expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// assertParseSuccess(parser, userInput, expectedCommand); -// } -// -// @Test -// public void parse_someFieldsSpecified_success() { -// Index targetIndex = INDEX_FIRST_ENTRY; -// String userInput = targetIndex.getOneBased() + NAME_DESC_FOOD_EXPENSE + TAG_DESC_WANT + AMOUNT_FOOD_EXPENSE; -// -// EditExpenseDescriptor descriptor = new EditExpenseDescriptorBuilder().withDescription(VALID_DESC_FOOD_EXPENSE) -// .withTags(VALID_TAG_CLOTHING_WANT).withAmount(VALID_AMOUNT_FOOD_EXPENSE).build(); -// EditExpenseCommand expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// -// assertParseSuccess(parser, userInput, expectedCommand); -// } -// -// @Test -// public void parse_oneFieldSpecified_success() { -// // description -// Index targetIndex = INDEX_THIRD_ENTRY; -// String userInput = targetIndex.getOneBased() + NAME_DESC_FOOD_EXPENSE; -// EditExpenseDescriptor descriptor = new EditExpenseDescriptorBuilder().withDescription(VALID_DESC_FOOD_EXPENSE) -// .build(); -// EditExpenseCommand expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// assertParseSuccess(parser, userInput, expectedCommand); -// -// // amount -// userInput = targetIndex.getOneBased() + AMOUNT_FOOD_EXPENSE; -// descriptor = new EditExpenseDescriptorBuilder().withAmount(VALID_AMOUNT_FOOD_EXPENSE).build(); -// expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// assertParseSuccess(parser, userInput, expectedCommand); -// -// // date -// userInput = targetIndex.getOneBased() + DATE_FOOD_EXPENSE; -// descriptor = new EditExpenseDescriptorBuilder().withDate(VALID_DATE_FOOD_EXPENSE).build(); -// expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// assertParseSuccess(parser, userInput, expectedCommand); -// -// // category -// userInput = targetIndex.getOneBased() + CATEGORY_NAME_EXPENSE_FOR_ENTRIES; -// descriptor = new EditExpenseDescriptorBuilder().withCategory(VALID_CATEGORY_FOOD_EXPENSE).build(); -// expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// assertParseSuccess(parser, userInput, expectedCommand); -// -// // tags -// userInput = targetIndex.getOneBased() + TAG_DESC_CLOTHING; -// descriptor = new EditExpenseDescriptorBuilder().withTags(VALID_TAG_CLOTHING_CLOTHES).build(); -// expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// assertParseSuccess(parser, userInput, expectedCommand); -// } -// -// @Test -// public void parse_multipleRepeatedFields_acceptsLast() { -// Index targetIndex = INDEX_FIRST_ENTRY; -// String userInput = targetIndex.getOneBased() + NAME_DESC_FOOD_EXPENSE + TAG_DESC_WANT + TAG_DESC_FOOD -// + AMOUNT_FOOD_EXPENSE + DATE_FOOD_EXPENSE + CATEGORY_FOOD_EXPENSE + TAG_DESC_CLOTHING -// + NAME_DESC_CLOTHING_EXPENSE + AMOUNT_CLOTHING_EXPENSE + DATE_CLOTHING_EXPENSE -// + CATEGORY_CLOTHING_EXPENSE; -// -// //TODO: WILL ACCEPT TAGS EVEN IF SPREAD OUT -// EditExpenseDescriptor descriptor = new EditExpenseDescriptorBuilder() -// .withDescription(VALID_DESC_CLOTHING_EXPENSE).withAmount(VALID_AMOUNT_CLOTHING_EXPENSE) -// .withDate(VALID_DATE_CLOTHING_EXPENSE).withCategory(VALID_CATEGORY_CLOTHING_EXPENSE) -// .withTags(VALID_TAG_CLOTHING_CLOTHES, VALID_TAG_CLOTHING_WANT, VALID_TAG_FOOD) -// .build(); -// -// EditExpenseCommand expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// -// assertParseSuccess(parser, userInput, expectedCommand); -// } -// -// @Test -// public void parse_invalidValueFollowedByValidValue_failure() { -// // invalid value followed by valid value -// Index targetIndex = INDEX_FIRST_ENTRY; -// String userInput = targetIndex.getOneBased() + INVALID_AMOUNT + NAME_DESC_FOOD_EXPENSE; -// assertParseFailure(parser, userInput, Amount.MESSAGE_CONSTRAINTS); -// -// // valid value followed by invalid value -// userInput = targetIndex.getOneBased() + NAME_DESC_FOOD_EXPENSE + INVALID_AMOUNT; -// assertParseFailure(parser, userInput, Amount.MESSAGE_CONSTRAINTS); -// -// //valid amount, valid Description, invalid tags -// userInput = targetIndex.getOneBased() + AMOUNT_FOOD_EXPENSE + NAME_DESC_FOOD_EXPENSE + INVALID_TAG_DESC; -// assertParseFailure(parser, userInput, Tag.MESSAGE_CONSTRAINTS); -// } -// -// @Test -// public void parse_resetTags_success() { -// Index targetIndex = INDEX_THIRD_ENTRY; -// String userInput = targetIndex.getOneBased() + TAG_EMPTY; -// -// EditExpenseDescriptor descriptor = new EditExpenseDescriptorBuilder().withTags().build(); -// EditExpenseCommand expectedCommand = new EditExpenseCommand(targetIndex, descriptor); -// -// assertParseSuccess(parser, userInput, expectedCommand); -// } -//} +package seedu.guilttrip.logic.parser; + +import static seedu.guilttrip.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.guilttrip.logic.commands.CommandTestUtil.CATEGORY_NAME_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.CATEGORY_NAME_FOR_EDIT_NEW; +import static seedu.guilttrip.logic.commands.CommandTestUtil.CATEGORY_NAME_FOR_EDIT_OLD; +import static seedu.guilttrip.logic.commands.CommandTestUtil.CATEGORY_TYPE_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.INVALID_CATEGORY_NAME_FOR_EDIT_NEW; +import static seedu.guilttrip.logic.commands.CommandTestUtil.INVALID_CATEGORY_TYPE_BUDGET; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_CATEGORY_FOOD_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_CATEGORY_TYPE_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_DESC_FOOD_EXPENSE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_NEW_CATEGORY_NAME; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_OLD_CATEGORY_NAME; +import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_TAG; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseSuccess; + +import org.junit.jupiter.api.Test; +import seedu.guilttrip.logic.commands.editcommands.EditCategoryCommand; +import seedu.guilttrip.logic.commands.editcommands.EditExpenseCommand; +import seedu.guilttrip.logic.parser.editcommandparsers.EditCategoryCommandParser; +import seedu.guilttrip.model.entry.Category; +import seedu.guilttrip.model.entry.Description; +import seedu.guilttrip.testutil.EditCategoryDescriptorBuilder; + +public class EditCategoryCommandParserTest { + + private static final String TAG_EMPTY = " " + PREFIX_TAG; + + private static final String MESSAGE_INVALID_FORMAT = + String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCategoryCommand.MESSAGE_USAGE); + + private EditCategoryCommandParser parser = new EditCategoryCommandParser(); + + @Test + public void parse_missingParts_failure() { + // no category type specified + assertParseFailure(parser, CATEGORY_NAME_FOR_EDIT_OLD + + CATEGORY_NAME_FOR_EDIT_NEW , MESSAGE_INVALID_FORMAT); + + // no old category name specified + assertParseFailure(parser, CATEGORY_TYPE_EXPENSE + + CATEGORY_NAME_FOR_EDIT_NEW , MESSAGE_INVALID_FORMAT); + + // no new category name specified + assertParseFailure(parser, CATEGORY_TYPE_EXPENSE + + CATEGORY_NAME_FOR_EDIT_OLD, MESSAGE_INVALID_FORMAT); + + // no field specified + assertParseFailure(parser, " ", MESSAGE_INVALID_FORMAT); + } + + @Test + public void parse_invalidPreamble_failure() { + // invalid arguments being parsed as preamble + assertParseFailure(parser, "some random string", MESSAGE_INVALID_FORMAT); + + // invalid prefix being parsed as preamble + assertParseFailure(parser, "i/ string", MESSAGE_INVALID_FORMAT); + } + + @Test + public void parse_invalidValue_failure() { + //invalid Category type + assertParseFailure(parser, INVALID_CATEGORY_TYPE_BUDGET + CATEGORY_NAME_FOR_EDIT_OLD + + CATEGORY_NAME_FOR_EDIT_NEW, Category.MESSAGE_CONSTRAINTS_TYPE); // invalid name + } + + @Test + public void parse_allFieldsSpecified_success() { + String userInput = CATEGORY_TYPE_EXPENSE + CATEGORY_NAME_FOR_EDIT_OLD + CATEGORY_NAME_FOR_EDIT_NEW; + Category oldCategoryToEdit = new Category(VALID_OLD_CATEGORY_NAME, VALID_CATEGORY_TYPE_EXPENSE); + EditCategoryCommand.EditCategoryDescriptor descriptor = new EditCategoryDescriptorBuilder() + .withCategoryName(VALID_NEW_CATEGORY_NAME).withCategoryType(VALID_CATEGORY_TYPE_EXPENSE).build(); + EditCategoryCommand expectedCommand = new EditCategoryCommand(oldCategoryToEdit, descriptor); + assertParseSuccess(parser, userInput, expectedCommand); + } + +} diff --git a/src/test/java/seedu/guilttrip/storage/JsonAdaptedCategoryTest.java b/src/test/java/seedu/guilttrip/storage/JsonAdaptedCategoryTest.java new file mode 100644 index 00000000000..8987aa97280 --- /dev/null +++ b/src/test/java/seedu/guilttrip/storage/JsonAdaptedCategoryTest.java @@ -0,0 +1,61 @@ +package seedu.guilttrip.storage; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static seedu.guilttrip.storage.JsonAdaptedCategory.MISSING_FIELD_MESSAGE_FORMAT; +import static seedu.guilttrip.storage.JsonAdaptedCategory.WRONG_CATEGORY_TYPE_MESSAGE_FORMAT; +import static seedu.guilttrip.testutil.Assert.assertThrows; +import static seedu.guilttrip.testutil.TypicalEntries.CATEGORY_SHOPPING; + +import org.junit.jupiter.api.Test; +import seedu.guilttrip.commons.exceptions.IllegalValueException; +import seedu.guilttrip.model.entry.Category; + +public class JsonAdaptedCategoryTest { + + private static final String INVALID_CATEGORY_NAME_BLANK = ""; + private static final String INVALID_CATEGORY_TYPE_BLANK = ""; + private static final String INVALID_CATEGORY_TYPE_BUDGET = "Budget"; + + private static final String VALID_CATEGORY_NAME = CATEGORY_SHOPPING.getCategoryName().toString(); + private static final String VALID_CATEGORY_TYPE = CATEGORY_SHOPPING.getCategoryType().toString(); + + @Test + public void toModelType_validCategoryDetails_returnsExpense() throws Exception { + JsonAdaptedCategory category = new JsonAdaptedCategory(CATEGORY_SHOPPING); + assertEquals(CATEGORY_SHOPPING, category.toModelType()); + } + + @Test + public void toModelType_invalidValues_throwsIllegalArgumentExceptionAndIllegalValueExeption() { + //blank Name + JsonAdaptedCategory expenseWithBlankCategoryName = + new JsonAdaptedCategory(INVALID_CATEGORY_NAME_BLANK, VALID_CATEGORY_TYPE); + String expectedMessage = Category.MESSAGE_CONSTRAINTS_NAME_NOT_EMPTY; + assertThrows(IllegalArgumentException.class, expectedMessage, expenseWithBlankCategoryName::toModelType); + + //blank Type + JsonAdaptedCategory expenseWithBlankCategoryType = + new JsonAdaptedCategory(VALID_CATEGORY_NAME, INVALID_CATEGORY_TYPE_BLANK); + expectedMessage = String.format(WRONG_CATEGORY_TYPE_MESSAGE_FORMAT, VALID_CATEGORY_NAME); + assertThrows(IllegalValueException.class, expectedMessage, expenseWithBlankCategoryType::toModelType); + + //Wrong Type + JsonAdaptedCategory expenseWithWrongType = + new JsonAdaptedCategory(VALID_CATEGORY_NAME, INVALID_CATEGORY_TYPE_BUDGET); + expectedMessage = String.format(WRONG_CATEGORY_TYPE_MESSAGE_FORMAT, VALID_CATEGORY_NAME); + assertThrows(IllegalValueException.class, expectedMessage, expenseWithWrongType::toModelType); + } + + @Test + public void toModelType_nullCategory_throwsIllegalValueException() { + JsonAdaptedCategory expenseWithNullType = + new JsonAdaptedCategory(VALID_CATEGORY_NAME, null); + String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, "category Type"); + assertThrows(IllegalValueException.class, expectedMessage, expenseWithNullType::toModelType); + + JsonAdaptedCategory expenseWithNullName = + new JsonAdaptedCategory(null, VALID_CATEGORY_TYPE); + expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, "category Name"); + assertThrows(IllegalValueException.class, expectedMessage, expenseWithNullName::toModelType); + } +} From cc6cf44f192e0695846055d36d1d2a6cb12c1a69 Mon Sep 17 00:00:00 2001 From: MC Date: Thu, 7 Nov 2019 16:31:23 +0800 Subject: [PATCH 2/2] Update more tests --- .../SwitchStatisticsCommand.java | 26 ------------- .../SortAutoExpenseCommandParser.java | 26 +++++-------- .../SortBudgetCommandParser.java | 28 +++++--------- .../SortExpenseCommandParser.java | 29 +++++---------- .../SortIncomeCommandParser.java | 28 +++++--------- .../SortWishCommandParser.java | 26 +++++-------- .../guilttrip/model/entry/SortSequence.java | 10 ++--- .../seedu/guilttrip/model/entry/SortType.java | 12 +++--- .../logic/commands/CommandTestUtil.java | 9 ++++- .../DeleteExpenseCommandParserTest.java | 25 +++++++++++++ .../parser/SortExpenseCommandParserTest.java | 36 ++++++++++++++++++ .../model/entry/SortSequenceTest.java | 36 ++++++++++++++++++ .../guilttrip/model/entry/SortTypeTest.java | 37 +++++++++++++++++++ 13 files changed, 201 insertions(+), 127 deletions(-) delete mode 100644 src/main/java/seedu/guilttrip/logic/commands/statisticscommands/SwitchStatisticsCommand.java create mode 100644 src/test/java/seedu/guilttrip/logic/parser/DeleteExpenseCommandParserTest.java create mode 100644 src/test/java/seedu/guilttrip/logic/parser/SortExpenseCommandParserTest.java create mode 100644 src/test/java/seedu/guilttrip/model/entry/SortSequenceTest.java create mode 100644 src/test/java/seedu/guilttrip/model/entry/SortTypeTest.java diff --git a/src/main/java/seedu/guilttrip/logic/commands/statisticscommands/SwitchStatisticsCommand.java b/src/main/java/seedu/guilttrip/logic/commands/statisticscommands/SwitchStatisticsCommand.java deleted file mode 100644 index a0875aa9297..00000000000 --- a/src/main/java/seedu/guilttrip/logic/commands/statisticscommands/SwitchStatisticsCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package seedu.guilttrip.logic.commands.statisticscommands; - -import static java.util.Objects.requireNonNull; - -import java.util.ArrayList; -import java.util.List; - -import seedu.guilttrip.logic.CommandHistory; -import seedu.guilttrip.logic.commands.Command; -import seedu.guilttrip.logic.commands.CommandResult; -import seedu.guilttrip.model.Model; - -/** - * Switches in between the Statistics Graphics and the Statistics Table in guilttrip. - */ -public class SwitchStatisticsCommand extends Command { - - public static final String COMMAND_WORD = "switchStats"; - public static final String MESSAGE_SUCCESS = "Switched Stats."; - - @Override - public CommandResult execute(Model model, CommandHistory history) { - requireNonNull(model); - return new CommandResult(MESSAGE_SUCCESS, new ArrayList(List.of(true, true))); - } -} diff --git a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortAutoExpenseCommandParser.java b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortAutoExpenseCommandParser.java index 7a45cb7411f..aa8e5d979d2 100644 --- a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortAutoExpenseCommandParser.java +++ b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortAutoExpenseCommandParser.java @@ -27,25 +27,17 @@ public class SortAutoExpenseCommandParser implements Parser { * @throws ParseException if the user input does not conform the expected format */ public SortBudgetCommand parse(String args) throws ParseException, IllegalArgumentException { - try { - ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); - - if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) - || !argMultimap.getPreamble().isEmpty()) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, - SortBudgetCommand.MESSAGE_USAGE)); - } - SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); - SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); - return new SortBudgetCommand(type, seq); - } catch (IllegalArgumentException iea) { - throw new IllegalArgumentException(String.format(MESSAGE_INVALID_ARGUMENT_FORMAT, - SortType.MESSAGE_CONSTRAINTS)); - } catch (ParseException pe) { - throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortBudgetCommand.MESSAGE_USAGE), pe); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); + + if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) + || !argMultimap.getPreamble().isEmpty()) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + SortBudgetCommand.MESSAGE_USAGE)); } + SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); + SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); + return new SortBudgetCommand(type, seq); } diff --git a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortExpenseCommandParser.java b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortExpenseCommandParser.java index 6eb2113dc96..df1909332ac 100644 --- a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortExpenseCommandParser.java +++ b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortExpenseCommandParser.java @@ -1,6 +1,5 @@ package seedu.guilttrip.logic.parser.sortcommandparsers; -import static seedu.guilttrip.commons.core.Messages.MESSAGE_INVALID_ARGUMENT_FORMAT; import static seedu.guilttrip.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_SEQUENCE; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_TYPE; @@ -28,25 +27,17 @@ public class SortExpenseCommandParser implements Parser { * @throws ParseException if the user input does not conform the expected format */ public SortExpenseCommand parse(String args) throws ParseException, IllegalArgumentException { - try { - ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); - - if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) - || !argMultimap.getPreamble().isEmpty()) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, - SortExpenseCommand.MESSAGE_USAGE)); - } - SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); - SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); - return new SortExpenseCommand(type, seq); - } catch (IllegalArgumentException iea) { - throw new IllegalArgumentException(String.format(MESSAGE_INVALID_ARGUMENT_FORMAT, - SortType.MESSAGE_CONSTRAINTS)); - } catch (ParseException pe) { - throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortExpenseCommand.MESSAGE_USAGE), pe); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); + + if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) + || !argMultimap.getPreamble().isEmpty()) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + SortExpenseCommand.MESSAGE_USAGE)); } + SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); + SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); + return new SortExpenseCommand(type, seq); } diff --git a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortIncomeCommandParser.java b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortIncomeCommandParser.java index 13eb7cba45f..0fa091e2119 100644 --- a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortIncomeCommandParser.java +++ b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortIncomeCommandParser.java @@ -28,25 +28,17 @@ public class SortIncomeCommandParser implements Parser { * @throws ParseException if the user input does not conform the expected format */ public SortIncomeCommand parse(String args) throws ParseException, IllegalArgumentException { - try { - ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); - - if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) - || !argMultimap.getPreamble().isEmpty()) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, - SortIncomeCommand.MESSAGE_USAGE)); - } - SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); - SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); - return new SortIncomeCommand(type, seq); - } catch (IllegalArgumentException iea) { - throw new IllegalArgumentException(String.format(MESSAGE_INVALID_ARGUMENT_FORMAT, - SortType.MESSAGE_CONSTRAINTS)); - } catch (ParseException pe) { - throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortIncomeCommand.MESSAGE_USAGE), pe); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); + + if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) + || !argMultimap.getPreamble().isEmpty()) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + SortIncomeCommand.MESSAGE_USAGE)); } + SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); + SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); + return new SortIncomeCommand(type, seq); } private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) { diff --git a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortWishCommandParser.java b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortWishCommandParser.java index 3ed06c2309e..08040556abc 100644 --- a/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortWishCommandParser.java +++ b/src/main/java/seedu/guilttrip/logic/parser/sortcommandparsers/SortWishCommandParser.java @@ -29,25 +29,17 @@ public class SortWishCommandParser implements Parser { * @throws ParseException if the user input does not conform the expected format */ public SortWishCommand parse(String args) throws ParseException, IllegalArgumentException { - try { - ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_TYPE, PREFIX_SEQUENCE); - if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) - || !argMultimap.getPreamble().isEmpty()) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, - SortIncomeCommand.MESSAGE_USAGE)); - } - SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); - SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); - return new SortWishCommand(type, seq); - } catch (IllegalArgumentException iea) { - throw new IllegalArgumentException(String.format(MESSAGE_INVALID_ARGUMENT_FORMAT, - SortType.MESSAGE_CONSTRAINTS)); - } catch (ParseException pe) { - throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortWishCommand.MESSAGE_USAGE), pe); + if (!arePrefixesPresent(argMultimap, PREFIX_TYPE, PREFIX_SEQUENCE) + || !argMultimap.getPreamble().isEmpty()) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + SortIncomeCommand.MESSAGE_USAGE)); } + SortType type = ParserUtil.parseSortType(argMultimap.getValue(PREFIX_TYPE).get().toLowerCase()); + SortSequence seq = ParserUtil.parseSortSequence(argMultimap.getValue(PREFIX_SEQUENCE).get().toLowerCase()); + return new SortWishCommand(type, seq); } private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) { diff --git a/src/main/java/seedu/guilttrip/model/entry/SortSequence.java b/src/main/java/seedu/guilttrip/model/entry/SortSequence.java index 44aa5cac650..43ba8125ce0 100644 --- a/src/main/java/seedu/guilttrip/model/entry/SortSequence.java +++ b/src/main/java/seedu/guilttrip/model/entry/SortSequence.java @@ -19,20 +19,20 @@ public class SortSequence { public final String sequence; /** - * Constructs a {@code Name}. + * Constructs a {@code SortSequence}. * - * @param desc A valid name. + * @param sequence A valid name. */ public SortSequence(String sequence) { requireNonNull(sequence); - checkArgument(isValidDescription(sequence), MESSAGE_CONSTRAINTS); + checkArgument(isValidSortSequence(sequence), MESSAGE_CONSTRAINTS); this.sequence = sequence; } /** - * Returns true if a given string is a valid name. + * Returns true if a given string is a valid SortSequence. */ - public static boolean isValidDescription(String test) { + public static boolean isValidSortSequence(String test) { return (test.equalsIgnoreCase("ascending") || test.equalsIgnoreCase("descending")); } diff --git a/src/main/java/seedu/guilttrip/model/entry/SortType.java b/src/main/java/seedu/guilttrip/model/entry/SortType.java index 5b1783aa35b..1ba0a2db15f 100644 --- a/src/main/java/seedu/guilttrip/model/entry/SortType.java +++ b/src/main/java/seedu/guilttrip/model/entry/SortType.java @@ -6,7 +6,7 @@ import java.util.Arrays; /** - * Represents a SortType in the finance manager. + * Represents a SortType in the guiltTrip. * Guarantees: details are present and not null, field values are validated, immutable. */ public class SortType { @@ -23,20 +23,20 @@ public class SortType { public final String fullType; /** - * Constructs a {@code Name}. + * Constructs a {@code SortType}. * - * @param desc A valid name. + * @param fullType A valid sortType. */ public SortType(String fullType) throws IllegalArgumentException { requireNonNull(fullType); - checkArgument(isValidDescription(fullType), MESSAGE_CONSTRAINTS); + checkArgument(isValidSortType(fullType), MESSAGE_CONSTRAINTS); this.fullType = fullType; } /** - * Returns true if a given string is a valid name. + * Returns true if a given string is a valid sortType. */ - public static boolean isValidDescription(String test) { + public static boolean isValidSortType(String test) { return Arrays.stream(VALIDATIONLIST).anyMatch(t -> t.equalsIgnoreCase(test)); } diff --git a/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java b/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java index e9fa78a6966..661851f079c 100644 --- a/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/guilttrip/logic/commands/CommandTestUtil.java @@ -6,7 +6,9 @@ import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_DATE; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_DESC; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_OLD_NAME; +import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_SEQUENCE; import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_TAG; +import static seedu.guilttrip.logic.parser.CliSyntax.PREFIX_TYPE; import seedu.guilttrip.logic.CommandHistory; import seedu.guilttrip.logic.commands.editcommands.EditCategoryCommand; @@ -76,7 +78,6 @@ public class CommandTestUtil { public static final String CATEGORY_NAME_FOR_EDIT_OLD = " " + PREFIX_OLD_NAME + VALID_OLD_CATEGORY_NAME; public static final String INVALID_CATEGORY_NAME_FOR_EDIT_NEW = " " + PREFIX_DESC + VALID_OLD_CATEGORY_NAME; - public static final String INVALID_CATEGORY_TYPE_BUDGET = " " + PREFIX_CATEGORY + "Budget"; public static final String INVALID_CATEGORY_NAME = " " + PREFIX_DESC + "Alcohol"; public static final String INVALID_CATEGORY_NAME_FOR_EDIT = " " + PREFIX_OLD_NAME + "Alcohol"; @@ -86,6 +87,12 @@ public class CommandTestUtil { public static final double AMOUNT = 200.00; public static final String AMOUNT_STRING = "200.00"; + //Sort related TestUtils. + public static final String VALID_SORT_TYPE = "time"; + public static final String VALID_SORT_SEQUENCE = "ascending"; + public static final String SORT_TYPE_TIME = " " + PREFIX_TYPE + VALID_SORT_TYPE; + public static final String SORT_TYPE_ASCENDING = " " + PREFIX_SEQUENCE + VALID_SORT_SEQUENCE; + public static final String FIND_BY_DESCRIPTION = " " + PREFIX_DESC + DESCRIPTION; public static final String FIND_BY_AMOUNT = " " + PREFIX_AMOUNT + AMOUNT; diff --git a/src/test/java/seedu/guilttrip/logic/parser/DeleteExpenseCommandParserTest.java b/src/test/java/seedu/guilttrip/logic/parser/DeleteExpenseCommandParserTest.java new file mode 100644 index 00000000000..1468c1b7225 --- /dev/null +++ b/src/test/java/seedu/guilttrip/logic/parser/DeleteExpenseCommandParserTest.java @@ -0,0 +1,25 @@ +package seedu.guilttrip.logic.parser; + +import static seedu.guilttrip.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseSuccess; +import static seedu.guilttrip.testutil.TypicalIndexes.INDEX_FIRST_ENTRY; + +import org.junit.jupiter.api.Test; +import seedu.guilttrip.logic.commands.deletecommands.DeleteExpenseCommand; +import seedu.guilttrip.logic.parser.deletecommandparsers.DeleteExpenseCommandParser; + +public class DeleteExpenseCommandParserTest { + private DeleteExpenseCommandParser parser = new DeleteExpenseCommandParser(); + + @Test + public void parse_validArgs_returnsDeleteCommand() { + assertParseSuccess(parser, "1", new DeleteExpenseCommand(INDEX_FIRST_ENTRY)); + } + + @Test + public void parse_invalidArgs_throwsParseException() { + assertParseFailure(parser, "a", String.format(MESSAGE_INVALID_COMMAND_FORMAT, + DeleteExpenseCommand.MESSAGE_USAGE)); + } +} diff --git a/src/test/java/seedu/guilttrip/logic/parser/SortExpenseCommandParserTest.java b/src/test/java/seedu/guilttrip/logic/parser/SortExpenseCommandParserTest.java new file mode 100644 index 00000000000..c7cf011de5c --- /dev/null +++ b/src/test/java/seedu/guilttrip/logic/parser/SortExpenseCommandParserTest.java @@ -0,0 +1,36 @@ +package seedu.guilttrip.logic.parser; + +import static seedu.guilttrip.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.guilttrip.logic.commands.CommandTestUtil.SORT_TYPE_ASCENDING; +import static seedu.guilttrip.logic.commands.CommandTestUtil.SORT_TYPE_TIME; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_SORT_SEQUENCE; +import static seedu.guilttrip.logic.commands.CommandTestUtil.VALID_SORT_TYPE; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.guilttrip.logic.parser.CommandParserTestUtil.assertParseSuccess; +import static seedu.guilttrip.testutil.TypicalIndexes.INDEX_FIRST_ENTRY; + +import org.junit.jupiter.api.Test; +import seedu.guilttrip.logic.commands.deletecommands.DeleteExpenseCommand; +import seedu.guilttrip.logic.commands.sortcommands.SortExpenseCommand; +import seedu.guilttrip.logic.parser.sortcommandparsers.SortExpenseCommandParser; +import seedu.guilttrip.model.entry.SortSequence; +import seedu.guilttrip.model.entry.SortType; + +public class SortExpenseCommandParserTest { + + private SortExpenseCommandParser parser = new SortExpenseCommandParser(); + + @Test + public void parse_validArgs_returnsSortCommand() { + SortSequence sortSeq = new SortSequence(VALID_SORT_SEQUENCE); + SortType sortType = new SortType(VALID_SORT_TYPE); + assertParseSuccess(parser, SORT_TYPE_TIME + SORT_TYPE_ASCENDING, + new SortExpenseCommand(sortType, sortSeq)); + } + + @Test + public void parse_invalidArgs_throwsParseException() { + assertParseFailure(parser, "a", String.format(MESSAGE_INVALID_COMMAND_FORMAT, + DeleteExpenseCommand.MESSAGE_USAGE)); + } +} diff --git a/src/test/java/seedu/guilttrip/model/entry/SortSequenceTest.java b/src/test/java/seedu/guilttrip/model/entry/SortSequenceTest.java new file mode 100644 index 00000000000..49d58beed95 --- /dev/null +++ b/src/test/java/seedu/guilttrip/model/entry/SortSequenceTest.java @@ -0,0 +1,36 @@ +package seedu.guilttrip.model.entry; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.guilttrip.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class SortSequenceTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new SortSequence(null)); + } + + @Test + public void constructor_invalidDescription_throwsIllegalArgumentException() { + String invalidSortSequence = ""; + assertThrows(IllegalArgumentException.class, () -> new SortSequence(invalidSortSequence)); + } + + @Test + public void isValidDescription() { + // null sortSequence + assertThrows(NullPointerException.class, () -> SortSequence.isValidSortSequence(null)); + + // invalid sortSequence + assertFalse(SortSequence.isValidSortSequence("")); // empty string + assertFalse(SortSequence.isValidSortSequence(" ")); // spaces only + + // valid sortSequence + assertTrue(SortSequence.isValidSortSequence("ascending")); // ascending only + assertTrue(SortSequence.isValidSortSequence("descending")); // descending only + assertTrue(SortSequence.isValidSortSequence("AsCenDING")); // upper and lower case characters + } +} diff --git a/src/test/java/seedu/guilttrip/model/entry/SortTypeTest.java b/src/test/java/seedu/guilttrip/model/entry/SortTypeTest.java new file mode 100644 index 00000000000..e0e41c60c3e --- /dev/null +++ b/src/test/java/seedu/guilttrip/model/entry/SortTypeTest.java @@ -0,0 +1,37 @@ +package seedu.guilttrip.model.entry; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.guilttrip.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class SortTypeTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new SortType(null)); + } + + @Test + public void constructor_invalidDescription_throwsIllegalArgumentException() { + String invalidSortType = ""; + assertThrows(IllegalArgumentException.class, () -> new SortType(invalidSortType)); + } + + @Test + public void isValidDescription() { + // invalid SortType + assertFalse(SortType.isValidSortType("")); // empty string + assertFalse(SortType.isValidSortType(" ")); // spaces only + + // valid SortType + assertTrue(SortType.isValidSortType("Category")); // ascending only + assertTrue(SortType.isValidSortType("Time")); // ascending only + assertTrue(SortType.isValidSortType("Description")); // ascending only + assertTrue(SortType.isValidSortType("Tags")); // ascending only + assertTrue(SortType.isValidSortType("Amount")); // ascending only + assertTrue(SortType.isValidSortType("AmOuNt")); // ascending only + assertTrue(SortType.isValidSortType("TAgS")); // ascending only + } +}