diff --git a/src/main/java/seedu/todo/controllers/UpdateController.java b/src/main/java/seedu/todo/controllers/UpdateController.java index 29207a393a5f..43b40c6bf021 100644 --- a/src/main/java/seedu/todo/controllers/UpdateController.java +++ b/src/main/java/seedu/todo/controllers/UpdateController.java @@ -28,17 +28,18 @@ public class UpdateController extends Controller { private static final String COMMAND_SYNTAX = "update by "; private static final String COMMAND_KEYWORD = "update"; - private static final String MESSAGE_UPDATE_SUCCESS = "Item successfully updated!"; + public static final String MESSAGE_UPDATE_SUCCESS = "Item successfully updated!"; public static final String MESSAGE_INVALID_ITEM_OR_PARAM = "Please specify a valid index and parameter to update!"; public static final String MESSAGE_CANNOT_PARSE_DATE = "We could not parse the date in your previous command, please correct it."; - private static final String UPDATE_EVENT_TEMPLATE = "update %s [name \"%s\"] [from \"%s\" to \"%s\"]"; - private static final String UPDATE_TASK_TEMPLATE = "update %s [name \"%s\"] [by \"%s\"]"; - private static final String START_TIME_FIELD = ""; - private static final String END_TIME_FIELD = ""; - private static final String DEADLINE_FIELD = ""; - private static final String NAME_FIELD = ""; - private static final String INDEX_FIELD = ""; + public static final String STRING_NULL = "null"; + public static final String UPDATE_EVENT_TEMPLATE = "update %s [name \"%s\"] [from \"%s\" to \"%s\"]"; + public static final String UPDATE_TASK_TEMPLATE = "update %s [name \"%s\"] [by \"%s\"]"; + public static final String START_TIME_FIELD = ""; + public static final String END_TIME_FIELD = ""; + public static final String DEADLINE_FIELD = ""; + public static final String NAME_FIELD = ""; + public static final String INDEX_FIELD = ""; private static CommandDefinition commandDefinition = new CommandDefinition(NAME, DESCRIPTION, COMMAND_SYNTAX, COMMAND_KEYWORD); @@ -101,25 +102,28 @@ public void process(String input) throws ParseException { } // Parse natural date using Natty. - LocalDateTime dateFrom; - LocalDateTime dateTo; + LocalDateTime dateFrom = null; + LocalDateTime dateTo = null; try { dateFrom = naturalFrom == null ? null : DateParser.parseNatural(naturalFrom); dateTo = naturalTo == null ? null : DateParser.parseNatural(naturalTo); } catch (InvalidNaturalDateException e) { - renderDisambiguation(isTask, recordIndex, name, naturalFrom, naturalTo, MESSAGE_CANNOT_PARSE_DATE); - return; + // Allow exception for "null" + if (!naturalFrom.trim().equals(STRING_NULL)) { + renderDisambiguation(isTask, recordIndex, name, naturalFrom, naturalTo, MESSAGE_CANNOT_PARSE_DATE); + return; + } } // Validate isTask, name and times. - if (!validateParams(isTask, calendarItem, name, dateFrom, dateTo)) { + if (!validateParams(isTask, calendarItem, name, dateFrom, dateTo, naturalFrom)) { renderDisambiguation(isTask, (int) recordIndex, name, naturalFrom, naturalTo, null); return; } // Update and persist task / event. TodoListDB db = TodoListDB.getInstance(); - updateCalendarItem(db, calendarItem, isTask, name, dateFrom, dateTo); + updateCalendarItem(db, calendarItem, isTask, name, dateFrom, dateTo, naturalFrom); // Re-render Renderer.renderIndex(db, MESSAGE_UPDATE_SUCCESS); @@ -171,7 +175,7 @@ private String parseName(Map parsedResult) { * End date for Event */ private void updateCalendarItem(TodoListDB db, CalendarItem record, boolean isTask, String name, - LocalDateTime dateFrom, LocalDateTime dateTo) { + LocalDateTime dateFrom, LocalDateTime dateTo, String naturalFrom) { // Update name if not null if (name != null) { record.setName(name); @@ -182,6 +186,8 @@ private void updateCalendarItem(TodoListDB db, CalendarItem record, boolean isTa Task task = (Task) record; if (dateFrom != null) { task.setDueDate(dateFrom); + } else if (naturalFrom != null && naturalFrom.trim().equals(STRING_NULL)) { + task.setDueDate(null); } } else { Event event = (Event) record; @@ -224,11 +230,12 @@ private void updateCalendarItem(TodoListDB db, CalendarItem record, boolean isTa * @return */ private boolean validateParams(boolean isTask, CalendarItem record, String name, LocalDateTime dateFrom, - LocalDateTime dateTo) { + LocalDateTime dateTo, String naturalFrom) { // TODO: Not enough sleep // We really need proper ActiveRecord validation and rollback, sigh... - if (name == null && dateFrom == null && dateTo == null) { + if (name == null && dateFrom == null && dateTo == null + && (naturalFrom == null || !naturalFrom.equals(STRING_NULL))) { return false; } diff --git a/src/test/java/seedu/todo/guitests/UpdateCommandTest.java b/src/test/java/seedu/todo/guitests/UpdateCommandTest.java index 9e78fce4e585..6e7eadd36926 100644 --- a/src/test/java/seedu/todo/guitests/UpdateCommandTest.java +++ b/src/test/java/seedu/todo/guitests/UpdateCommandTest.java @@ -69,18 +69,15 @@ public void updateCommand_updateFloatingTaskToNewDeadline_success() { assertTaskVisible(testTask); } - @Ignore @Test public void updateCommand_updateTaskWithDeadlineToFloatingTask() { - // TODO: Make this pass - // Add a task console.runCommand("add Buy milk by today"); // Update the task - String command = "update 1 nodeadline"; + String command = "update 1 by null"; testTask.setName("Buy milk"); - testTask.setDueDate(DateUtil.NO_DATETIME_VALUE); + testTask.setDueDate(null); console.runCommand(command); assertTaskVisible(testTask); } @@ -132,7 +129,9 @@ public void updateCommand_updateEventEndDate_success() { public void updateTask_missingIndex_disambiguate() { console.runCommand("add Buy milk"); console.runCommand("update"); - assertEquals("update [name \"\"] [by \"\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE, + UpdateController.INDEX_FIELD, UpdateController.NAME_FIELD, UpdateController.DEADLINE_FIELD); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(UpdateController.MESSAGE_INVALID_ITEM_OR_PARAM, console); } @@ -140,7 +139,9 @@ public void updateTask_missingIndex_disambiguate() { public void updateTask_missingUpdateParams_disambiguate() { console.runCommand("add Buy milk"); console.runCommand("update 1"); - assertEquals("update 1 [name \"\"] [by \"\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE, + "1", UpdateController.NAME_FIELD, UpdateController.DEADLINE_FIELD); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(null, console); } @@ -148,7 +149,9 @@ public void updateTask_missingUpdateParams_disambiguate() { public void updateTask_missingParamType_disambiguate() { console.runCommand("add Buy milk"); console.runCommand("update 1 Buy bread"); - assertEquals("update [name \"\"] [by \"\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE, + UpdateController.INDEX_FIELD, UpdateController.NAME_FIELD, UpdateController.DEADLINE_FIELD); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(UpdateController.MESSAGE_INVALID_ITEM_OR_PARAM, console); } @@ -156,7 +159,9 @@ public void updateTask_missingParamType_disambiguate() { public void updateTask_missingParamValue_disambiguate() { console.runCommand("add Buy milk"); console.runCommand("update 1 name"); - assertEquals("update 1 [name \"\"] [by \"\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE, + "1", UpdateController.NAME_FIELD, UpdateController.DEADLINE_FIELD); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(null, console); } @@ -164,7 +169,9 @@ public void updateTask_missingParamValue_disambiguate() { public void updateTask_invalidIndex_disambiguate() { console.runCommand("add Buy milk"); console.runCommand("update 2 name Buy bread"); - assertEquals("update 2 [name \"Buy bread\"] [by \"\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE, + "2", "Buy bread", UpdateController.DEADLINE_FIELD); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(UpdateController.MESSAGE_INVALID_ITEM_OR_PARAM, console); } @@ -172,7 +179,9 @@ public void updateTask_invalidIndex_disambiguate() { public void updateTask_invalidDate_disambiguate() { console.runCommand(String.format("add Buy milk by %s", twoDaysFromNowIsoString)); console.runCommand("update 1 by invaliddate"); - assertEquals("update 1 [name \"\"] [by \"invaliddate\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE, + "1", UpdateController.NAME_FIELD, "invaliddate"); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(UpdateController.MESSAGE_CANNOT_PARSE_DATE, console); } @@ -180,7 +189,9 @@ public void updateTask_invalidDate_disambiguate() { public void updateEvent_missingParamValue_disambiguate() { console.runCommand(String.format("add event Presentation from %s 2pm to %s 9pm", twoDaysFromNowIsoString, twoDaysFromNowIsoString)); console.runCommand("update 1 name"); - assertEquals("update 1 [name \"\"] [from \"\" to \"\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_EVENT_TEMPLATE, + "1", UpdateController.NAME_FIELD, UpdateController.START_TIME_FIELD, UpdateController.END_TIME_FIELD); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(null, console); } @@ -188,7 +199,9 @@ public void updateEvent_missingParamValue_disambiguate() { public void updateEvent_missingParamValueDate_disambiguate() { console.runCommand(String.format("add event Presentation from %s 2pm to %s 9pm", twoDaysFromNowIsoString, twoDaysFromNowIsoString)); console.runCommand("update 1 name"); - assertEquals("update 1 [name \"\"] [from \"\" to \"\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_EVENT_TEMPLATE, + "1", UpdateController.NAME_FIELD, UpdateController.START_TIME_FIELD, UpdateController.END_TIME_FIELD); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(null, console); } @@ -196,7 +209,9 @@ public void updateEvent_missingParamValueDate_disambiguate() { public void updateEvent_invalidStartDate_disambiguate() { console.runCommand(String.format("add event Presentation from %s 2pm to %s 9pm", twoDaysFromNowIsoString, twoDaysFromNowIsoString)); console.runCommand("update 1 from invaliddate to today 2pm"); - assertEquals("update 1 [name \"\"] [from \"invaliddate\" to \"today 2pm\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_EVENT_TEMPLATE, + "1", UpdateController.NAME_FIELD, "invaliddate", "today 2pm"); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(UpdateController.MESSAGE_CANNOT_PARSE_DATE, console); } @@ -204,14 +219,19 @@ public void updateEvent_invalidStartDate_disambiguate() { public void updateEvent_invalidEndDate_disambiguate() { console.runCommand(String.format("add event Presentation from %s 2pm to %s 9pm", twoDaysFromNowIsoString, twoDaysFromNowIsoString)); console.runCommand("update 1 from today 2pm to invaliddate"); - assertEquals("update 1 [name \"\"] [from \"today 2pm\" to \"invaliddate\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_EVENT_TEMPLATE, + "1", UpdateController.NAME_FIELD, "today 2pm", "invaliddate"); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(UpdateController.MESSAGE_CANNOT_PARSE_DATE, console); } + @Test public void updateTask_withStartEndDate_disambiguate() { console.runCommand(String.format("add Buy milk", twoDaysFromNowIsoString, twoDaysFromNowIsoString)); console.runCommand("update 1 from 2pm to today 9pm"); - assertEquals("update 1 [name \"\"] [by \"2pm\"]", console.getConsoleInputText()); + String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE, + "1", UpdateController.NAME_FIELD, "2pm"); + assertEquals(consoleMessage, console.getConsoleInputText()); assertSameDisambiguationMessage(null, console); }