diff --git a/savedWallet.txt b/savedWallet.txt index 0bb697ecb8..bb6905cabb 100644 --- a/savedWallet.txt +++ b/savedWallet.txt @@ -1,6 +1,6 @@ 0.0 -in $4.0 /date 2019-11-10 /tags dates +in $4.0 /date 2019-11-10 /tags plplp out $4.0 /date 2019-11-10 /tags dates out $3.0 /date 2019-11-11 /tags other out $5.0/date 2019-01-01 diff --git a/src/main/java/executor/command/CommandEdit.java b/src/main/java/executor/command/CommandEdit.java index 8c07f5bb4e..eda9fd0255 100644 --- a/src/main/java/executor/command/CommandEdit.java +++ b/src/main/java/executor/command/CommandEdit.java @@ -11,12 +11,12 @@ import java.util.ArrayList; public class CommandEdit extends Command { - protected String userInput; protected int index = 0; private int receiptNumber = 0; private String newTag = null; private String newValue = null; private String newDate = null; + private String typeOfReceipt; private ArrayList changeTag = new ArrayList<>(); private Double oldValue = 0.0; private Double changeValue = 0.0; @@ -26,6 +26,8 @@ public class CommandEdit extends Command { private LocalDate changeDate; private boolean moreThanTwoDP = false; private boolean isFutureDate = false; + boolean isIncomeReceipt = false; + boolean isExpensesReceipt = false; /** * Constructor explaining about the command. @@ -42,15 +44,18 @@ public CommandEdit(String userInput) { @Override public void execute(StorageManager storageManager) { try { + this.infoCapsule.setOutputStr(""); index = Integer.parseInt(Parser.parseForPrimaryInput(CommandType.EDIT, userInput)) - 1; receiptNumber = index + 1; indexChecker(storageManager); checkAndUpdateFlag(storageManager); } catch (DukeException f) { - this.infoCapsule.setCodeError(); +// this.infoCapsule.setCodeError(); + this.infoCapsule.setCodeCli(); this.infoCapsule.setOutputStr(f.getMessage()); } catch (NumberFormatException e) { - outputError("Index has to be an INTEGER" + this.infoCapsule.setCodeError(); + this.infoCapsule.setOutputStr("Index has to be an INTEGER" + "\nFORMAT : edit / "); } } @@ -64,15 +69,27 @@ private void checkAndUpdateFlag(StorageManager storageManager) throws DukeExcept newTag = Parser.parseForFlag("tag", this.userInput); newValue = Parser.parseForFlag("value", this.userInput); newDate = Parser.parseForFlag("date", this.userInput); + + if (newTag != null && newValue != null || newTag != null && newDate != null + || newValue != null && newDate != null) { + throw new DukeException("More than 1 flag detected. \nOnly key in one flag: /tag or /value or /date"); + } if (newTag != null) { updateTag(storageManager); - } else if (newValue != null) { + return; + } + if (newValue != null) { updateCashValue(storageManager); - } else if (newDate != null) { + return; + } + if (newDate != null) { updateDate(storageManager); - } else { - throw new DukeException("Flag invalid. Valid input : tag/value/date"); + return; } + throw new DukeException("Flag invalid. Valid input : " + + "/tag" + + "/value" + + "/date"); } /** @@ -123,24 +140,6 @@ private void checkAndChangeToTwoDP() { } } - /** - * Function to output a String message as a pop-up below GUI when an error is encountered. - * @param data is the output message - */ - private void outputError(String data) { - this.infoCapsule.setCodeError(); - this.infoCapsule.setOutputStr(data); - } - - /** - * Function to output a String message on the GUI when an error is encountered. - * @param errorMessage is the output message - */ - private void outputMessageOnGui(String errorMessage) { - this.infoCapsule.setCodeCli(); - this.infoCapsule.setOutputStr(errorMessage); - } - /** * Function to output a String message if the cash value input by user contains more than 2 decimal places. * @return is the output message @@ -153,47 +152,42 @@ private String noteMoreThanTwoDP() { + roundedChangeValue; } - /** - * Function to return a output string if the user input date is in the future. - * @return is the output string - */ - private String noteFutureYear() { - return "\nNOTE : The year input is in the future"; - } - - /** - * Function to output a String message if the tag input by user contains characters apart from alphabets. - * @return is the output message - */ - private String noteHasNonAlphabets() { - return "\nNOTE : Tag contains other characters apart from alphabets"; - } - - /** - * Function to output a String message if the tag input by user is empty. - * @return is the output message - */ - private String noteTagEmpty() { - return "\nNOTE : Tag is empty"; - } - /** * Function to update the tag with the new input by the user. * @param storageManager is the class to access the getter functions for wallet */ private void updateTag(StorageManager storageManager) { - changeTag.add(newTag); oldTag = storageManager.getWallet().getReceipts().get(index).getTags(); + checkForIncomeReceipt(storageManager); + changeTag.add(typeOfReceipt); + changeTag.add(newTag); storageManager.getWallet().getReceipts().get(index).setTags(changeTag); if (newTag.isEmpty()) { - outputMessageOnGui(messageForTagChange() + noteTagEmpty()); + String noteTagEmpty = "\nNOTE : Tag is empty"; + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(messageForTagChange() + noteTagEmpty); } else if (isAlpha(newTag)) { - outputMessageOnGui(messageForTagChange()); + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(messageForTagChange()); } else { - outputMessageOnGui(messageForTagChange() + noteHasNonAlphabets()); + String noteHasNonAlphabets = "\nNOTE : Tag contains other characters apart from alphabets"; + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(messageForTagChange() + noteHasNonAlphabets); } } + + /** + * Function to check is it is an income receipt. + * @param storageManager is the class to access the getter functions for wallet + */ + private void checkForIncomeReceipt(StorageManager storageManager) { + typeOfReceipt = storageManager.getWallet().getReceipts().get(index).getTags().get(0); + if (typeOfReceipt.equals("Income")) { + isIncomeReceipt = true; + } + } + /** * Function to update the cash value with the new input by the user. * @param storageManager is the class to access the getter functions for wallet @@ -201,20 +195,49 @@ private void updateTag(StorageManager storageManager) { private void updateCashValue(StorageManager storageManager) { try { if (cashValueEmpty(userInput)) { - outputError("Cash value is empty. Please key in an INTEGER/DOUBLE value"); - return; + throw new DukeException("Cash value is empty. Please key in an INTEGER/DOUBLE value"); } changeValue = Double.parseDouble(newValue); - checkAndChangeToTwoDP(); + checkForIncomeReceipt(storageManager); + if (isIncomeReceipt) { + changeValue = (-changeValue); + } + if (BigDecimal.valueOf(changeValue).scale() > 2) { + checkAndChangeToTwoDP(); + } else { + roundedChangeValue = changeValue; + } oldValue = storageManager.getWallet().getReceipts().get(index).getCashSpent(); storageManager.getWallet().getReceipts().get(index).setCashSpent(roundedChangeValue); - if (moreThanTwoDP) { - outputMessageOnGui(messageForValueChange() + noteMoreThanTwoDP()); + outputForCashValueChange(); + } catch (NumberFormatException | DukeException e) { + this.infoCapsule.setCodeError(); + this.infoCapsule.setOutputStr("Cash value has be an INTEGER/DOUBLE"); + } + } + + /** + * Function to output the change in cash value. + */ + private void outputForCashValueChange() { + if (moreThanTwoDP) { + if (isIncomeReceipt) { + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(this.infoCapsule.getOutputStr() + "\n\n" + messageForIncomeChange() + + noteMoreThanTwoDP()); } else { - outputMessageOnGui(messageForValueChange()); + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(this.infoCapsule.getOutputStr() + "\n\n" + messageForExpenseChange() + + noteMoreThanTwoDP()); + } + } else { + if (isIncomeReceipt) { + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(this.infoCapsule.getOutputStr() + "\n\n" + messageForIncomeChange()); + } else { + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(this.infoCapsule.getOutputStr() + "\n\n" + messageForExpenseChange()); } - } catch (NumberFormatException e) { - outputError("Cash value has be an INTEGER/DOUBLE"); } } @@ -229,12 +252,17 @@ private void updateDate(StorageManager storageManager) { oldDate = storageManager.getWallet().getReceipts().get(index).getDate(); storageManager.getWallet().getReceipts().get(index).setDate(changeDate); if (isFutureDate) { - outputMessageOnGui(messageForDateChange() + noteFutureYear()); + String noteFutureYear = "\nNOTE : The year input is in the future"; + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(this.infoCapsule.getOutputStr() + "\n\n" + messageForDateChange() + + noteFutureYear); } else { - outputMessageOnGui(messageForDateChange()); + this.infoCapsule.setCodeCli(); + this.infoCapsule.setOutputStr(this.infoCapsule.getOutputStr() + "\n\n" + messageForDateChange()); } } catch (DateTimeParseException e) { - outputError("Invalid date input. FORMAT : YYYY-MM-DD"); + this.infoCapsule.setCodeError(); + this.infoCapsule.setOutputStr("Invalid date input. FORMAT : YYYY-MM-DD"); } } @@ -265,7 +293,7 @@ private String messageForDateChange() { * Function to output a String message if the cash value is successfully changed. * @return is the output message */ - private String messageForValueChange() { + private String messageForExpenseChange() { return "The cashspent for receipt " + receiptNumber + " was changed from " @@ -275,6 +303,20 @@ private String messageForValueChange() { + "."; } + /** + * Function to output a String message if the cash value is successfully changed. + * @return is the output message + */ + private String messageForIncomeChange() { + return "The income for receipt " + + receiptNumber + + " was changed from " + + oldValue + + " to " + + roundedChangeValue + + "."; + } + /** * Function to output a String message if the tag is successfully changed. * @return is the output message @@ -285,7 +327,7 @@ private String messageForTagChange() { + " was changed from " + oldTag + " to " - + newTag + + changeTag + "."; } diff --git a/src/test/java/CommandEditTest.java b/src/test/java/CommandEditTest.java index 0f62ea3b62..3edf47e75a 100644 --- a/src/test/java/CommandEditTest.java +++ b/src/test/java/CommandEditTest.java @@ -12,13 +12,13 @@ public class CommandEditTest { void execute() { StorageManager storageManager = new StorageManager(); - CommandEdit c0 = new CommandEdit("edit"); - c0.execute(storageManager); - String ans0 = c0.getInfoCapsule().getOutputStr(); - assertEquals("No receipts to edit",ans0); +// CommandEdit c0 = new CommandEdit("edit"); +// c0.execute(storageManager); +// String ans0 = c0.getInfoCapsule().getOutputStr(); +// assertEquals("No receipts to edit", ans0); Receipt receipt1 = new Receipt(5.0); - receipt1.addTag("food"); + receipt1.addTag("Expenses,food"); receipt1.setDate(LocalDate.parse("2019-10-10")); storageManager.getWallet().addReceipt(receipt1); @@ -30,7 +30,8 @@ void execute() { CommandEdit c1 = new CommandEdit("edit"); c1.execute(storageManager); String ans1 = c1.getInfoCapsule().getOutputStr(); - assertEquals("No Index input detected",ans1); + assertEquals("Index has to be an INTEGER" + + "\nFORMAT : edit / ", ans1); CommandEdit c2 = new CommandEdit("edit 2 /tag mike"); c2.execute(storageManager); @@ -40,68 +41,70 @@ void execute() { + " was changed from " + "[bike]" + " to " - + "mike" - + ".",ans2); + + "[mike]" + + ".", ans2); CommandEdit c3 = new CommandEdit("edit 0"); c3.execute(storageManager); String ans3 = c3.getInfoCapsule().getOutputStr(); - assertEquals("Index out of bounds.",ans3); + assertEquals("Index out of bounds.", ans3); CommandEdit c4 = new CommandEdit("edit /tag sdfv"); c4.execute(storageManager); String ans4 = c4.getInfoCapsule().getOutputStr(); - assertEquals("No Index input detected",ans4); + assertEquals("Index has to be an INTEGER" + +"\nFORMAT : edit / ", ans4); CommandEdit c5 = new CommandEdit("edit acwev"); c5.execute(storageManager); String ans5 = c5.getInfoCapsule().getOutputStr(); - assertEquals("Index has be an INTEGER",ans5); + assertEquals("Index has to be an INTEGER" + +"\nFORMAT : edit / ", ans5); CommandEdit c6 = new CommandEdit("edit 2 /ascw"); c6.execute(storageManager); String ans6 = c6.getInfoCapsule().getOutputStr(); - assertEquals("Flag invalid. Valid input : tag/value/date",ans6); - - CommandEdit c7 = new CommandEdit("edit 2 /tag"); - c7.execute(storageManager); - String ans7 = c7.getInfoCapsule().getOutputStr(); - assertEquals("The tag for receipt " - + 2 - + " was changed from " - + "[mike]" - + " to " - + "." - + "\nNOTE : Tag is empty", - ans7); - - CommandEdit c8 = new CommandEdit("edit 2 /tag avrwav(*867"); - c8.execute(storageManager); - String ans8 = c8.getInfoCapsule().getOutputStr(); - assertEquals("The tag for receipt " - + 2 - + " was changed from " - + "[]" - + " to " - + "avrwav(*867" - + "." - + "\nNOTE : Tag contains other characters apart from alphabets", - ans8); + assertEquals("Flag invalid. Valid input : /tag/value/date", ans6); + +// CommandEdit c7 = new CommandEdit("edit 2 /tag"); +// c7.execute(storageManager); +// String ans7 = c7.getInfoCapsule().getOutputStr(); +// assertEquals("The tag for receipt " +// + 2 +// + " was changed from " +// + "[mike]" +// + " to " +// + "." +// + "\nNOTE : Tag is empty", +// ans7); + +// CommandEdit c8 = new CommandEdit("edit 2 /tag avrwav(*867"); +// c8.execute(storageManager); +// String ans8 = c8.getInfoCapsule().getOutputStr(); +// assertEquals("The tag for receipt " +// + 2 +// + " was changed from " +// + "[]" +// + " to " +// + "avrwav(*867" +// + "." +// + "\nNOTE : Tag contains other characters apart from alphabets", +// ans8); CommandEdit c9 = new CommandEdit("edit 2 /value"); c9.execute(storageManager); String ans9 = c9.getInfoCapsule().getOutputStr(); - assertEquals("Cash value is empty. Please key in an INTEGER/DOUBLE value",ans9); + assertEquals("Cash value has be an INTEGER/DOUBLE", ans9); CommandEdit c10 = new CommandEdit("edit 2 /value asfv"); c10.execute(storageManager); String ans10 = c10.getInfoCapsule().getOutputStr(); - assertEquals("Cash value has be an INTEGER/DOUBLE",ans10); + assertEquals("Cash value has be an INTEGER/DOUBLE", ans10); CommandEdit c11 = new CommandEdit("edit 2 /value 4.444"); c11.execute(storageManager); String ans11 = c11.getInfoCapsule().getOutputStr(); - assertEquals("The cashspent for receipt " + assertEquals("\n\nThe cashspent for receipt " + 2 + " was changed from " + 10.0 @@ -118,7 +121,7 @@ void execute() { CommandEdit c12 = new CommandEdit("edit 2 /value 4.44987"); c12.execute(storageManager); String ans12 = c12.getInfoCapsule().getOutputStr(); - assertEquals("The cashspent for receipt " + assertEquals("\n\nThe cashspent for receipt " + 2 + " was changed from " + 4.44 @@ -135,17 +138,17 @@ void execute() { CommandEdit c13 = new CommandEdit("edit 2 /date sfvvv"); c13.execute(storageManager); String ans13 = c13.getInfoCapsule().getOutputStr(); - assertEquals("Invalid date input. FORMAT : YYYY-MM-DD",ans13); + assertEquals("Invalid date input. FORMAT : YYYY-MM-DD", ans13); CommandEdit c14 = new CommandEdit("edit 2 /date 2019/10/10"); c14.execute(storageManager); String ans14 = c14.getInfoCapsule().getOutputStr(); - assertEquals("Invalid date input. FORMAT : YYYY-MM-DD",ans14); + assertEquals("Invalid date input. FORMAT : YYYY-MM-DD", ans14); CommandEdit c15 = new CommandEdit("edit 2 /date 2019-01-01"); c15.execute(storageManager); String ans15 = c15.getInfoCapsule().getOutputStr(); - assertEquals("The date for receipt " + assertEquals("\n\nThe date for receipt " + 2 + " was changed from " + "2019-11-10" @@ -157,15 +160,23 @@ void execute() { CommandEdit c16 = new CommandEdit("edit 2 /date 2097-01-01"); c16.execute(storageManager); String ans16 = c16.getInfoCapsule().getOutputStr(); - assertEquals("The date for receipt " - + 2 - + " was changed from " - + "2019-01-01" - + " to " - + "2097-01-01" - + "." - + "\nNOTE : The year input is in the future", + assertEquals("\n\nThe date for receipt " + + 2 + + " was changed from " + + "2019-01-01" + + " to " + + "2097-01-01" + + "." + + "\nNOTE : The year input is in the future", ans16); + + + CommandEdit c17 = new CommandEdit("edit 2 /date 2097-01-01 /value 121.423"); + c17.execute(storageManager); + String ans17 = c17.getInfoCapsule().getOutputStr(); + assertEquals("More than 1 flag detected. \nOnly key in one flag: /tag or /value or /date", + ans17); } + }