Skip to content

Commit

Permalink
Merge a3b9695 into a15ce32
Browse files Browse the repository at this point in the history
  • Loading branch information
louietyj committed Nov 6, 2016
2 parents a15ce32 + a3b9695 commit 79ff762
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 33 deletions.
41 changes: 24 additions & 17 deletions src/main/java/seedu/todo/controllers/UpdateController.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,18 @@ public class UpdateController extends Controller {
private static final String COMMAND_SYNTAX = "update <index> <task> by <deadline>";
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 = "<start time>";
private static final String END_TIME_FIELD = "<end time>";
private static final String DEADLINE_FIELD = "<deadline>";
private static final String NAME_FIELD = "<name>";
private static final String INDEX_FIELD = "<index>";
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 = "<start time>";
public static final String END_TIME_FIELD = "<end time>";
public static final String DEADLINE_FIELD = "<deadline / null>";
public static final String NAME_FIELD = "<name>";
public static final String INDEX_FIELD = "<index>";

private static CommandDefinition commandDefinition = new CommandDefinition(NAME, DESCRIPTION, COMMAND_SYNTAX, COMMAND_KEYWORD);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -171,7 +175,7 @@ private String parseName(Map<String, String[]> 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);
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down
52 changes: 36 additions & 16 deletions src/test/java/seedu/todo/guitests/UpdateCommandTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -132,86 +129,109 @@ public void updateCommand_updateEventEndDate_success() {
public void updateTask_missingIndex_disambiguate() {
console.runCommand("add Buy milk");
console.runCommand("update");
assertEquals("update <index> [name \"<name>\"] [by \"<deadline>\"]", 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);
}

@Test
public void updateTask_missingUpdateParams_disambiguate() {
console.runCommand("add Buy milk");
console.runCommand("update 1");
assertEquals("update 1 [name \"<name>\"] [by \"<deadline>\"]", console.getConsoleInputText());
String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE,
"1", UpdateController.NAME_FIELD, UpdateController.DEADLINE_FIELD);
assertEquals(consoleMessage, console.getConsoleInputText());
assertSameDisambiguationMessage(null, console);
}

@Test
public void updateTask_missingParamType_disambiguate() {
console.runCommand("add Buy milk");
console.runCommand("update 1 Buy bread");
assertEquals("update <index> [name \"<name>\"] [by \"<deadline>\"]", 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);
}

@Test
public void updateTask_missingParamValue_disambiguate() {
console.runCommand("add Buy milk");
console.runCommand("update 1 name");
assertEquals("update 1 [name \"<name>\"] [by \"<deadline>\"]", console.getConsoleInputText());
String consoleMessage = String.format(UpdateController.UPDATE_TASK_TEMPLATE,
"1", UpdateController.NAME_FIELD, UpdateController.DEADLINE_FIELD);
assertEquals(consoleMessage, console.getConsoleInputText());
assertSameDisambiguationMessage(null, console);
}

@Test
public void updateTask_invalidIndex_disambiguate() {
console.runCommand("add Buy milk");
console.runCommand("update 2 name Buy bread");
assertEquals("update 2 [name \"Buy bread\"] [by \"<deadline>\"]", 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);
}

@Test
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 \"<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);
}

@Test
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 \"<name>\"] [from \"<start time>\" to \"<end time>\"]", 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);
}

@Test
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 \"<name>\"] [from \"<start time>\" to \"<end time>\"]", 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);
}

@Test
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 \"<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);
}

@Test
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 \"<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 \"<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);
}

Expand Down

0 comments on commit 79ff762

Please sign in to comment.