From 210bd5d0b9202361b3f110bd29a006aedc9bf7a4 Mon Sep 17 00:00:00 2001 From: louietyj Date: Mon, 7 Nov 2016 01:24:50 +0800 Subject: [PATCH 1/6] Catches "null" for updating duedate, fixes #151 --- .../todo/controllers/UpdateController.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/todo/controllers/UpdateController.java b/src/main/java/seedu/todo/controllers/UpdateController.java index 29207a393a5f..42994eb1f899 100644 --- a/src/main/java/seedu/todo/controllers/UpdateController.java +++ b/src/main/java/seedu/todo/controllers/UpdateController.java @@ -32,11 +32,12 @@ public class UpdateController extends Controller { 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 STRING_NULL = "null"; 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 DEADLINE_FIELD = ""; private static final String NAME_FIELD = ""; private static final String INDEX_FIELD = ""; @@ -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.trim().equals(STRING_NULL)) { + task.setDueDate(null); } } else { Event event = (Event) record; @@ -224,11 +230,11 @@ 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.equals(STRING_NULL)) { return false; } From 47cf83352abbded9f808cfb33ca67e3e218d25f9 Mon Sep 17 00:00:00 2001 From: louietyj Date: Mon, 7 Nov 2016 01:40:44 +0800 Subject: [PATCH 2/6] Unignore null deadline test --- src/test/java/seedu/todo/guitests/UpdateCommandTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/test/java/seedu/todo/guitests/UpdateCommandTest.java b/src/test/java/seedu/todo/guitests/UpdateCommandTest.java index 9e78fce4e585..afdcf42a3eba 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); } From a8c98071bea64fdf2bb3bf8bff4e1061b20bdd2b Mon Sep 17 00:00:00 2001 From: louietyj Date: Mon, 7 Nov 2016 01:41:30 +0800 Subject: [PATCH 3/6] Guard against naturalFrom == null --- src/main/java/seedu/todo/controllers/UpdateController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/todo/controllers/UpdateController.java b/src/main/java/seedu/todo/controllers/UpdateController.java index 42994eb1f899..7b5309aed987 100644 --- a/src/main/java/seedu/todo/controllers/UpdateController.java +++ b/src/main/java/seedu/todo/controllers/UpdateController.java @@ -234,7 +234,8 @@ private boolean validateParams(boolean isTask, CalendarItem record, String name, // TODO: Not enough sleep // We really need proper ActiveRecord validation and rollback, sigh... - if (name == null && dateFrom == null && dateTo == null && !naturalFrom.equals(STRING_NULL)) { + if (name == null && dateFrom == null && dateTo == null + && (naturalFrom == null || !naturalFrom.equals(STRING_NULL))) { return false; } From 96d6323233b0f55961ba9c16736a113697d7ec20 Mon Sep 17 00:00:00 2001 From: louietyj Date: Mon, 7 Nov 2016 01:41:41 +0800 Subject: [PATCH 4/6] Set message strings to public --- .../todo/controllers/UpdateController.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/seedu/todo/controllers/UpdateController.java b/src/main/java/seedu/todo/controllers/UpdateController.java index 7b5309aed987..e66a4f6e8dbf 100644 --- a/src/main/java/seedu/todo/controllers/UpdateController.java +++ b/src/main/java/seedu/todo/controllers/UpdateController.java @@ -28,18 +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 STRING_NULL = "null"; - 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); From 0228135e212a71cb5d5e13be6a8b1b4181481ce3 Mon Sep 17 00:00:00 2001 From: louietyj Date: Mon, 7 Nov 2016 01:50:48 +0800 Subject: [PATCH 5/6] More guards against naturalFrom == null --- src/main/java/seedu/todo/controllers/UpdateController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/todo/controllers/UpdateController.java b/src/main/java/seedu/todo/controllers/UpdateController.java index e66a4f6e8dbf..43b40c6bf021 100644 --- a/src/main/java/seedu/todo/controllers/UpdateController.java +++ b/src/main/java/seedu/todo/controllers/UpdateController.java @@ -186,7 +186,7 @@ private void updateCalendarItem(TodoListDB db, CalendarItem record, boolean isTa Task task = (Task) record; if (dateFrom != null) { task.setDueDate(dateFrom); - } else if (naturalFrom.trim().equals(STRING_NULL)) { + } else if (naturalFrom != null && naturalFrom.trim().equals(STRING_NULL)) { task.setDueDate(null); } } else { From a3b969523728ab1c05c3e2f2f02a0bbc8a11ffc4 Mon Sep 17 00:00:00 2001 From: louietyj Date: Mon, 7 Nov 2016 01:55:39 +0800 Subject: [PATCH 6/6] Make tests read messages from Controller instead of hard-coding --- .../todo/guitests/UpdateCommandTest.java | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/test/java/seedu/todo/guitests/UpdateCommandTest.java b/src/test/java/seedu/todo/guitests/UpdateCommandTest.java index afdcf42a3eba..6e7eadd36926 100644 --- a/src/test/java/seedu/todo/guitests/UpdateCommandTest.java +++ b/src/test/java/seedu/todo/guitests/UpdateCommandTest.java @@ -129,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); } @@ -137,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); } @@ -145,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); } @@ -153,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); } @@ -161,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); } @@ -169,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); } @@ -177,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); } @@ -185,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); } @@ -193,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); } @@ -201,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); }