From 825248c6798b059e06c38b34955921a20a1e0e6e Mon Sep 17 00:00:00 2001 From: varung97 Date: Sat, 22 Oct 2016 11:40:04 +0800 Subject: [PATCH 1/6] Wrap filteredList in sortedList --- src/main/java/seedu/manager/logic/Logic.java | 2 +- .../seedu/manager/logic/LogicManager.java | 4 ++-- .../manager/logic/commands/AddCommand.java | 2 +- .../manager/logic/commands/DeleteCommand.java | 2 +- .../manager/logic/commands/DoneCommand.java | 2 +- .../manager/logic/commands/EditCommand.java | 2 +- .../manager/logic/commands/FindCommand.java | 4 ++-- .../manager/logic/commands/ListCommand.java | 2 +- src/main/java/seedu/manager/model/Model.java | 17 +++++++------ .../seedu/manager/model/ModelManager.java | 24 ++++++++++++++++--- .../java/seedu/manager/ui/MainWindow.java | 2 +- .../seedu/manager/logic/LogicManagerTest.java | 2 +- 12 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/main/java/seedu/manager/logic/Logic.java b/src/main/java/seedu/manager/logic/Logic.java index 169a3f14b97d..0eababafe7f5 100644 --- a/src/main/java/seedu/manager/logic/Logic.java +++ b/src/main/java/seedu/manager/logic/Logic.java @@ -17,6 +17,6 @@ public interface Logic { CommandResult execute(String commandText); /** Returns the filtered list of tasks */ - ObservableList getFilteredTaskList(); + ObservableList getSortedFilteredTaskList(); } diff --git a/src/main/java/seedu/manager/logic/LogicManager.java b/src/main/java/seedu/manager/logic/LogicManager.java index f3d51e972547..c7a9a5c7d76e 100644 --- a/src/main/java/seedu/manager/logic/LogicManager.java +++ b/src/main/java/seedu/manager/logic/LogicManager.java @@ -36,7 +36,7 @@ public CommandResult execute(String commandText) { } @Override - public ObservableList getFilteredTaskList() { - return model.getFilteredTaskList(); + public ObservableList getSortedFilteredTaskList() { + return model.getSortedFilteredTaskList(); } } diff --git a/src/main/java/seedu/manager/logic/commands/AddCommand.java b/src/main/java/seedu/manager/logic/commands/AddCommand.java index 32bacbf8fae0..e2f7bf6b9f2c 100644 --- a/src/main/java/seedu/manager/logic/commands/AddCommand.java +++ b/src/main/java/seedu/manager/logic/commands/AddCommand.java @@ -45,7 +45,7 @@ public CommandResult execute() { try { model.addTask(toAdd); - int targetIndex = model.getFilteredTaskList().size(); + int targetIndex = model.getSortedFilteredTaskList().size(); EventsCenter.getInstance().post(new JumpToListRequestEvent(targetIndex - 1)); return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd.getAsPrettyText())); diff --git a/src/main/java/seedu/manager/logic/commands/DeleteCommand.java b/src/main/java/seedu/manager/logic/commands/DeleteCommand.java index 1cc5562e1d8e..40d92bbf110a 100644 --- a/src/main/java/seedu/manager/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/manager/logic/commands/DeleteCommand.java @@ -30,7 +30,7 @@ public DeleteCommand(int targetIndex) { public CommandResult execute() { assert model != null; - UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + UnmodifiableObservableList lastShownList = model.getSortedFilteredTaskList(); if (lastShownList.size() < targetIndex) { indicateAttemptToExecuteIncorrectCommand(); diff --git a/src/main/java/seedu/manager/logic/commands/DoneCommand.java b/src/main/java/seedu/manager/logic/commands/DoneCommand.java index 623ec786f095..ddc4f5dade53 100644 --- a/src/main/java/seedu/manager/logic/commands/DoneCommand.java +++ b/src/main/java/seedu/manager/logic/commands/DoneCommand.java @@ -35,7 +35,7 @@ public DoneCommand(int targetIndex) { public CommandResult execute() { assert model != null; - UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + UnmodifiableObservableList lastShownList = model.getSortedFilteredTaskList(); if (lastShownList.size() < targetIndex) { indicateAttemptToExecuteIncorrectCommand(); diff --git a/src/main/java/seedu/manager/logic/commands/EditCommand.java b/src/main/java/seedu/manager/logic/commands/EditCommand.java index 7ead2e4756f3..8113f31305fa 100644 --- a/src/main/java/seedu/manager/logic/commands/EditCommand.java +++ b/src/main/java/seedu/manager/logic/commands/EditCommand.java @@ -46,7 +46,7 @@ public EditCommand(int targetIndex, HashMap> ed public CommandResult execute() { assert model != null; - UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + UnmodifiableObservableList lastShownList = model.getSortedFilteredTaskList(); if (lastShownList.size() < targetIndex) { indicateAttemptToExecuteIncorrectCommand(); diff --git a/src/main/java/seedu/manager/logic/commands/FindCommand.java b/src/main/java/seedu/manager/logic/commands/FindCommand.java index eb054999ed91..a2078f441c1b 100644 --- a/src/main/java/seedu/manager/logic/commands/FindCommand.java +++ b/src/main/java/seedu/manager/logic/commands/FindCommand.java @@ -23,8 +23,8 @@ public FindCommand(Set keywords) { @Override public CommandResult execute() { - model.updateFilteredTaskList(keywords); - return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); + model.updateSortedFilteredTaskList(keywords); + return new CommandResult(getMessageForTaskListShownSummary(model.getSortedFilteredTaskList().size())); } } diff --git a/src/main/java/seedu/manager/logic/commands/ListCommand.java b/src/main/java/seedu/manager/logic/commands/ListCommand.java index 7152375471e2..a7ca75299463 100644 --- a/src/main/java/seedu/manager/logic/commands/ListCommand.java +++ b/src/main/java/seedu/manager/logic/commands/ListCommand.java @@ -14,7 +14,7 @@ public ListCommand() {} @Override public CommandResult execute() { - model.updateFilteredListToShowAll(); + model.updateSortedFilteredListToShowAll(); return new CommandResult(MESSAGE_SUCCESS); } } diff --git a/src/main/java/seedu/manager/model/Model.java b/src/main/java/seedu/manager/model/Model.java index 0c3892646045..56a9ea7874c3 100644 --- a/src/main/java/seedu/manager/model/Model.java +++ b/src/main/java/seedu/manager/model/Model.java @@ -23,13 +23,12 @@ public interface Model { /** Adds the given task */ void addTask(Task task) throws UniqueTaskList.DuplicateTaskException; - /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ - UnmodifiableObservableList getFilteredTaskList(); - - /** Updates the filter of the filtered task list to show all tasks */ - void updateFilteredListToShowAll(); - - /** Updates the filter of the filtered task list to filter by the given keywords*/ - void updateFilteredTaskList(Set keywords); - + /** Returns the sorted and filtered task list as an {@code UnmodifiableObservableList} */ + UnmodifiableObservableList getSortedFilteredTaskList(); + + /** Updates the filter of the sorted and filtered task list to show all tasks */ + void updateSortedFilteredListToShowAll(); + + /** Updates the filter of the sorted and filtered task list to filter by the given keywords*/ + void updateSortedFilteredTaskList(Set keywords); } diff --git a/src/main/java/seedu/manager/model/ModelManager.java b/src/main/java/seedu/manager/model/ModelManager.java index 18d1dc9fbbfe..e6e8b584f7e4 100644 --- a/src/main/java/seedu/manager/model/ModelManager.java +++ b/src/main/java/seedu/manager/model/ModelManager.java @@ -1,6 +1,7 @@ package seedu.manager.model; import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; import seedu.manager.commons.core.ComponentManager; import seedu.manager.commons.core.LogsCenter; import seedu.manager.commons.core.UnmodifiableObservableList; @@ -23,6 +24,7 @@ public class ModelManager extends ComponentManager implements Model { private final TaskManager taskManager; private final FilteredList filteredTasks; + private final SortedList sortedTasks; /** * Initializes a ModelManager with the given TaskManager @@ -37,6 +39,7 @@ public ModelManager(TaskManager src, UserPrefs userPrefs) { taskManager = new TaskManager(src); filteredTasks = new FilteredList<>(taskManager.getTasks()); + sortedTasks = new SortedList<>(filteredTasks); } public ModelManager() { @@ -46,6 +49,7 @@ public ModelManager() { public ModelManager(ReadOnlyTaskManager initialData, UserPrefs userPrefs) { taskManager = new TaskManager(initialData); filteredTasks = new FilteredList<>(taskManager.getTasks()); + sortedTasks = new SortedList<>(filteredTasks); } @Override @@ -76,20 +80,34 @@ public synchronized void addTask(Task task) throws UniqueTaskList.DuplicateTaskE updateFilteredListToShowAll(); indicateTaskManagerChanged(); } + + //=========== Sorted Task List Accessors =============================================================== + + @Override + public UnmodifiableObservableList getSortedFilteredTaskList() { + return new UnmodifiableObservableList<>(sortedTasks); + } + + @Override + public void updateSortedFilteredListToShowAll() { + updateFilteredListToShowAll(); + } + + @Override + public void updateSortedFilteredTaskList(Set keywords){ + updateFilteredTaskList(new PredicateExpression(new DescQualifier(keywords))); + } //=========== Filtered Task List Accessors =============================================================== - @Override public UnmodifiableObservableList getFilteredTaskList() { return new UnmodifiableObservableList<>(filteredTasks); } - @Override public void updateFilteredListToShowAll() { filteredTasks.setPredicate(null); } - @Override public void updateFilteredTaskList(Set keywords){ updateFilteredTaskList(new PredicateExpression(new DescQualifier(keywords))); } diff --git a/src/main/java/seedu/manager/ui/MainWindow.java b/src/main/java/seedu/manager/ui/MainWindow.java index 2e9332a8d765..64bae65ab911 100644 --- a/src/main/java/seedu/manager/ui/MainWindow.java +++ b/src/main/java/seedu/manager/ui/MainWindow.java @@ -110,7 +110,7 @@ private void setAccelerators() { } void fillInnerParts() { - taskListPanel = TaskListPanel.load(primaryStage, getTaskListPlaceholder(), logic.getFilteredTaskList()); + taskListPanel = TaskListPanel.load(primaryStage, getTaskListPlaceholder(), logic.getSortedFilteredTaskList()); resultDisplay = ResultDisplay.load(primaryStage, getResultDisplayPlaceholder()); statusBarFooter = StatusBarFooter.load(primaryStage, getStatusbarPlaceholder(), config.getTaskManagerFilePath()); commandBox = CommandBox.load(primaryStage, getCommandBoxPlaceholder(), resultDisplay, logic); diff --git a/src/test/java/seedu/manager/logic/LogicManagerTest.java b/src/test/java/seedu/manager/logic/LogicManagerTest.java index b443ef45051a..d790edb56b85 100644 --- a/src/test/java/seedu/manager/logic/LogicManagerTest.java +++ b/src/test/java/seedu/manager/logic/LogicManagerTest.java @@ -116,7 +116,7 @@ private void assertCommandBehavior(String inputCommand, String expectedMessage, //Confirm the ui display elements should contain the right data assertEquals(expectedMessage, result.feedbackToUser); - assertEquals(expectedShownList, model.getFilteredTaskList()); + assertEquals(expectedShownList, model.getSortedFilteredTaskList()); //Confirm the state of data (saved and in-memory) is as expected assertEquals(expectedTaskManager, model.getTaskManager()); From bd1cbe8e5d2a169471c09195aa4d306917f3afd8 Mon Sep 17 00:00:00 2001 From: varung97 Date: Sat, 22 Oct 2016 13:17:28 +0800 Subject: [PATCH 2/6] Model supports sorting, add needs unsorting to highlight --- .../seedu/manager/logic/commands/AddCommand.java | 1 + src/main/java/seedu/manager/model/Model.java | 8 +++++++- .../java/seedu/manager/model/ModelManager.java | 13 ++++++++++++- .../java/seedu/manager/model/task/Priority.java | 13 +++++++++++++ .../seedu/manager/model/task/ReadOnlyTask.java | 2 ++ src/main/java/seedu/manager/model/task/Task.java | 16 ++++++++++++++++ .../seedu/manager/model/task/TaskProperty.java | 6 +++++- .../java/seedu/manager/testutil/TestTask.java | 15 +++++++++++++++ 8 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/manager/logic/commands/AddCommand.java b/src/main/java/seedu/manager/logic/commands/AddCommand.java index e2f7bf6b9f2c..ccc63fbedcfb 100644 --- a/src/main/java/seedu/manager/logic/commands/AddCommand.java +++ b/src/main/java/seedu/manager/logic/commands/AddCommand.java @@ -44,6 +44,7 @@ public CommandResult execute() { assert model != null; try { model.addTask(toAdd); + model.unSortSortedFilteredTaskList(); int targetIndex = model.getSortedFilteredTaskList().size(); EventsCenter.getInstance().post(new JumpToListRequestEvent(targetIndex - 1)); diff --git a/src/main/java/seedu/manager/model/Model.java b/src/main/java/seedu/manager/model/Model.java index 56a9ea7874c3..ff1e43eb93d8 100644 --- a/src/main/java/seedu/manager/model/Model.java +++ b/src/main/java/seedu/manager/model/Model.java @@ -29,6 +29,12 @@ public interface Model { /** Updates the filter of the sorted and filtered task list to show all tasks */ void updateSortedFilteredListToShowAll(); - /** Updates the filter of the sorted and filtered task list to filter by the given keywords*/ + /** Updates the filter of the sorted and filtered task list to filter by the given keywords */ void updateSortedFilteredTaskList(Set keywords); + + /** Sorts the sorted and filtered task list by priority */ + void sortSortedFilteredTaskListByPriority(); + + /** Unsort the sorted and filtered task list */ + void unSortSortedFilteredTaskList(); } diff --git a/src/main/java/seedu/manager/model/ModelManager.java b/src/main/java/seedu/manager/model/ModelManager.java index e6e8b584f7e4..cb9ca93e844d 100644 --- a/src/main/java/seedu/manager/model/ModelManager.java +++ b/src/main/java/seedu/manager/model/ModelManager.java @@ -9,6 +9,7 @@ import seedu.manager.commons.util.StringUtil; import seedu.manager.model.task.ReadOnlyTask; import seedu.manager.model.task.Task; +import seedu.manager.model.task.Task.TaskProperties; import seedu.manager.model.task.UniqueTaskList; import seedu.manager.model.task.UniqueTaskList.TaskNotFoundException; @@ -81,7 +82,7 @@ public synchronized void addTask(Task task) throws UniqueTaskList.DuplicateTaskE indicateTaskManagerChanged(); } - //=========== Sorted Task List Accessors =============================================================== + //=========== Sorted and Filtered Task List Accessors =============================================================== @Override public UnmodifiableObservableList getSortedFilteredTaskList() { @@ -97,6 +98,16 @@ public void updateSortedFilteredListToShowAll() { public void updateSortedFilteredTaskList(Set keywords){ updateFilteredTaskList(new PredicateExpression(new DescQualifier(keywords))); } + + @Override + public void sortSortedFilteredTaskListByPriority() { + sortedTasks.setComparator((Task t1, Task t2) -> t1.compareProperty(t2, TaskProperties.PRIORITY)); + } + + @Override + public void unSortSortedFilteredTaskList() { + sortedTasks.setComparator(null); + } //=========== Filtered Task List Accessors =============================================================== diff --git a/src/main/java/seedu/manager/model/task/Priority.java b/src/main/java/seedu/manager/model/task/Priority.java index ec72caa10509..02d32c53d579 100644 --- a/src/main/java/seedu/manager/model/task/Priority.java +++ b/src/main/java/seedu/manager/model/task/Priority.java @@ -51,4 +51,17 @@ public boolean equals(Object other) { || (other instanceof Priority // instanceof handles nulls && this.value.equals(((Priority) other).value)); // state check } + + @Override + public int compareTo(TaskProperty other) { + assert other instanceof Priority; + + if (this.value.equals(((Priority) other).value)) { + return 0; + } else if (this.value.equals(VALUES.LOW) || ((Priority) other).value.equals(VALUES.HIGH)) { + return 1; + } else { + return -1; + } + } } \ No newline at end of file diff --git a/src/main/java/seedu/manager/model/task/ReadOnlyTask.java b/src/main/java/seedu/manager/model/task/ReadOnlyTask.java index d41082cb97c1..0f43d601ac9d 100644 --- a/src/main/java/seedu/manager/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/manager/model/task/ReadOnlyTask.java @@ -77,4 +77,6 @@ default String getAsPrettyText() { } return builder.toString(); } + + public int compareProperty(ReadOnlyTask other, TaskProperties property); } diff --git a/src/main/java/seedu/manager/model/task/Task.java b/src/main/java/seedu/manager/model/task/Task.java index dd0cc68ae77c..7a96034322d2 100644 --- a/src/main/java/seedu/manager/model/task/Task.java +++ b/src/main/java/seedu/manager/model/task/Task.java @@ -170,6 +170,22 @@ public boolean equals(Object other) { || (other instanceof ReadOnlyTask // instanceof handles nulls && this.isSameStateAs((ReadOnlyTask) other)); } + + @Override + public int compareProperty(ReadOnlyTask other, TaskProperties property) { + assert other != null; + HashMap> otherProps = other.getProperties(); + + if (!this.properties.get(property).isPresent() && !otherProps.get(property).isPresent()) { + return 0; + } else if (!this.properties.get(property).isPresent()) { + return 1; + } else if (!otherProps.get(property).isPresent()) { + return -1; + } else { + return this.properties.get(property).get().compareTo(otherProps.get(property).get()); + } + } @Override public int hashCode() { diff --git a/src/main/java/seedu/manager/model/task/TaskProperty.java b/src/main/java/seedu/manager/model/task/TaskProperty.java index 3018bf90d9db..c5890bfcf629 100644 --- a/src/main/java/seedu/manager/model/task/TaskProperty.java +++ b/src/main/java/seedu/manager/model/task/TaskProperty.java @@ -2,7 +2,7 @@ import seedu.manager.commons.exceptions.IllegalValueException; -public abstract class TaskProperty { +public abstract class TaskProperty implements Comparable { private static String MESSAGE_CONSTRAINTS; private static String VALIDATION_REGEX; @@ -62,4 +62,8 @@ public String toPrettyString() { } public abstract boolean equals(Object other); + + public int compareTo(TaskProperty other) { + return -1; + } } diff --git a/src/test/java/seedu/manager/testutil/TestTask.java b/src/test/java/seedu/manager/testutil/TestTask.java index dbccecf57e8c..fe276788079b 100644 --- a/src/test/java/seedu/manager/testutil/TestTask.java +++ b/src/test/java/seedu/manager/testutil/TestTask.java @@ -115,4 +115,19 @@ public HashMap> getPropertiesAsStrings() { return clone; } + + @Override + public int compareProperty(ReadOnlyTask other, TaskProperties property) { + assert other != null; + if (!this.properties.get(property).isPresent()) { + return -1; + } else { + HashMap> otherProps = other.getProperties(); + if (!otherProps.get(property).isPresent()) { + return -1; + } else { + return this.properties.get(property).get().compareTo(otherProps.get(property).get()); + } + } + } } From 96193848edbd7d2f56bdff4830c82098efc4b021 Mon Sep 17 00:00:00 2001 From: varung97 Date: Sun, 23 Oct 2016 16:04:41 +0800 Subject: [PATCH 3/6] AddCommand does not need unsorting, list and find unsort --- src/main/java/seedu/manager/logic/commands/AddCommand.java | 7 ++++--- .../java/seedu/manager/logic/commands/FindCommand.java | 1 + .../java/seedu/manager/logic/commands/ListCommand.java | 1 + src/main/java/seedu/manager/model/Model.java | 3 +++ src/main/java/seedu/manager/model/ModelManager.java | 5 +++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/manager/logic/commands/AddCommand.java b/src/main/java/seedu/manager/logic/commands/AddCommand.java index ccc63fbedcfb..aff1f3e2afe7 100644 --- a/src/main/java/seedu/manager/logic/commands/AddCommand.java +++ b/src/main/java/seedu/manager/logic/commands/AddCommand.java @@ -44,10 +44,11 @@ public CommandResult execute() { assert model != null; try { model.addTask(toAdd); - model.unSortSortedFilteredTaskList(); - int targetIndex = model.getSortedFilteredTaskList().size(); - EventsCenter.getInstance().post(new JumpToListRequestEvent(targetIndex - 1)); + int addedIndex = model.getIndexOfTask(toAdd); + assert addedIndex != -1; + + EventsCenter.getInstance().post(new JumpToListRequestEvent(addedIndex)); return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd.getAsPrettyText())); } catch (UniqueTaskList.DuplicateTaskException e) { diff --git a/src/main/java/seedu/manager/logic/commands/FindCommand.java b/src/main/java/seedu/manager/logic/commands/FindCommand.java index a2078f441c1b..5db95754536a 100644 --- a/src/main/java/seedu/manager/logic/commands/FindCommand.java +++ b/src/main/java/seedu/manager/logic/commands/FindCommand.java @@ -24,6 +24,7 @@ public FindCommand(Set keywords) { @Override public CommandResult execute() { model.updateSortedFilteredTaskList(keywords); + model.unSortSortedFilteredTaskList(); return new CommandResult(getMessageForTaskListShownSummary(model.getSortedFilteredTaskList().size())); } diff --git a/src/main/java/seedu/manager/logic/commands/ListCommand.java b/src/main/java/seedu/manager/logic/commands/ListCommand.java index a7ca75299463..922e259929fa 100644 --- a/src/main/java/seedu/manager/logic/commands/ListCommand.java +++ b/src/main/java/seedu/manager/logic/commands/ListCommand.java @@ -15,6 +15,7 @@ public ListCommand() {} @Override public CommandResult execute() { model.updateSortedFilteredListToShowAll(); + model.unSortSortedFilteredTaskList(); return new CommandResult(MESSAGE_SUCCESS); } } diff --git a/src/main/java/seedu/manager/model/Model.java b/src/main/java/seedu/manager/model/Model.java index ff1e43eb93d8..da8e5e8f84e8 100644 --- a/src/main/java/seedu/manager/model/Model.java +++ b/src/main/java/seedu/manager/model/Model.java @@ -37,4 +37,7 @@ public interface Model { /** Unsort the sorted and filtered task list */ void unSortSortedFilteredTaskList(); + + /** Returns index of task in sorted and filtered list */ + int getIndexOfTask(ReadOnlyTask task); } diff --git a/src/main/java/seedu/manager/model/ModelManager.java b/src/main/java/seedu/manager/model/ModelManager.java index cb9ca93e844d..83839a866d97 100644 --- a/src/main/java/seedu/manager/model/ModelManager.java +++ b/src/main/java/seedu/manager/model/ModelManager.java @@ -108,6 +108,11 @@ public void sortSortedFilteredTaskListByPriority() { public void unSortSortedFilteredTaskList() { sortedTasks.setComparator(null); } + + @Override + public int getIndexOfTask(ReadOnlyTask task) { + return sortedTasks.indexOf(task); + } //=========== Filtered Task List Accessors =============================================================== From 0f0f92f676c1611d187fb96c1bafa5bd1335befe Mon Sep 17 00:00:00 2001 From: varung97 Date: Sun, 23 Oct 2016 16:12:50 +0800 Subject: [PATCH 4/6] Added SortCommand to sort tasks by priority --- .../manager/logic/commands/SortCommand.java | 22 +++++++++++++++++++ .../seedu/manager/logic/parser/Parser.java | 3 +++ 2 files changed, 25 insertions(+) create mode 100644 src/main/java/seedu/manager/logic/commands/SortCommand.java diff --git a/src/main/java/seedu/manager/logic/commands/SortCommand.java b/src/main/java/seedu/manager/logic/commands/SortCommand.java new file mode 100644 index 000000000000..5e35f90edf25 --- /dev/null +++ b/src/main/java/seedu/manager/logic/commands/SortCommand.java @@ -0,0 +1,22 @@ +package seedu.manager.logic.commands; + +public class SortCommand extends Command { + + public static final String COMMAND_WORD = "sort"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Sorts the displayed tasks by priority, from highest to lowest. Tasks with no priority are shown last.\n" + + "Parameters: None\n" + + "Example: " + COMMAND_WORD; + + public static final String MESSAGE_SUCCESS = "Sorted Tasks"; + + public SortCommand() {} + + @Override + public CommandResult execute() { + model.sortSortedFilteredTaskListByPriority(); + return new CommandResult(MESSAGE_SUCCESS); + } + +} diff --git a/src/main/java/seedu/manager/logic/parser/Parser.java b/src/main/java/seedu/manager/logic/parser/Parser.java index 6f579650e584..fed6d9531d86 100644 --- a/src/main/java/seedu/manager/logic/parser/Parser.java +++ b/src/main/java/seedu/manager/logic/parser/Parser.java @@ -78,6 +78,9 @@ public Command parseCommand(String userInput) { case StorageCommand.COMMAND_WORD: return new StorageCommand(arguments); + + case SortCommand.COMMAND_WORD: + return new SortCommand(); default: return new IncorrectCommand(MESSAGE_UNKNOWN_COMMAND); From 039b81b08c5a1c5b11bc7dbb14e1fdf944f6b483 Mon Sep 17 00:00:00 2001 From: varung97 Date: Sun, 23 Oct 2016 18:42:41 +0800 Subject: [PATCH 5/6] Add tests for sort --- .../seedu/manager/logic/LogicManagerTest.java | 117 +++++++++++++++++- 1 file changed, 112 insertions(+), 5 deletions(-) diff --git a/src/test/java/seedu/manager/logic/LogicManagerTest.java b/src/test/java/seedu/manager/logic/LogicManagerTest.java index d790edb56b85..ce5915f5369d 100644 --- a/src/test/java/seedu/manager/logic/LogicManagerTest.java +++ b/src/test/java/seedu/manager/logic/LogicManagerTest.java @@ -113,7 +113,7 @@ private void assertCommandBehavior(String inputCommand, String expectedMessage, //Execute the command CommandResult result = logic.execute(inputCommand); - + //Confirm the ui display elements should contain the right data assertEquals(expectedMessage, result.feedbackToUser); assertEquals(expectedShownList, model.getSortedFilteredTaskList()); @@ -131,18 +131,18 @@ public void execute_unknownCommandWord() throws Exception { } @Test - public void execute_help() throws Exception { + public void execute_help_successful() throws Exception { assertCommandBehavior("help", HelpCommand.SHOWING_HELP_MESSAGE); assertTrue(helpShown); } @Test - public void execute_exit() throws Exception { + public void execute_exit_successful() throws Exception { assertCommandBehavior("exit", ExitCommand.MESSAGE_EXIT_ACKNOWLEDGEMENT); } @Test - public void execute_clear() throws Exception { + public void execute_clear_successful() throws Exception { TestDataHelper helper = new TestDataHelper(); model.addTask(helper.generateTask(1)); model.addTask(helper.generateTask(2)); @@ -150,6 +150,25 @@ public void execute_clear() throws Exception { assertCommandBehavior("clear", ClearCommand.MESSAGE_SUCCESS, new TaskManager(), Collections.emptyList()); } + + @Test + public void execute_sort_successful() throws Exception { + TestDataHelper helper = new TestDataHelper(); + model.addTask(helper.generateTask(1)); + model.addTask(helper.generateTask(2)); + model.addTask(helper.generateTask(3)); + + TaskManager expectedTM = new TaskManager(); + expectedTM.addTask(helper.generateTask(1)); + expectedTM.addTask(helper.generateTask(2)); + expectedTM.addTask(helper.generateTask(3)); + + List expectedList = new ArrayList<>(expectedTM.getTaskList()); + expectedList.sort((t1, t2) -> t1.compareProperty(t2, TaskProperties.PRIORITY)); + + assertCommandBehavior("sort", SortCommand.MESSAGE_SUCCESS, expectedTM, expectedList); + } + @Test public void execute_add_invalidTaskData() throws Exception { @@ -234,7 +253,34 @@ public void execute_addDuplicate_notAllowed() throws Exception { expectedAB.getTaskList()); } - + + @Test + public void execute_addAfterSorting_successful() throws Exception { + TestDataHelper helper = new TestDataHelper(); + Task toBeAdded = helper.guinevere(); + model.addTask(helper.generateTask(1)); + model.addTask(helper.generateTask(2)); + model.addTask(helper.generateTask(3)); + + logic.execute("sort"); + + TaskManager expectedTM = new TaskManager(); + expectedTM.addTask(helper.generateTask(1)); + expectedTM.addTask(helper.generateTask(2)); + expectedTM.addTask(helper.generateTask(3)); + expectedTM.addTask(toBeAdded); + + List expectedList = new ArrayList<>(expectedTM.getTaskList()); + expectedList.sort((t1, t2) -> t1.compareProperty(t2, TaskProperties.PRIORITY)); + + assertCommandBehavior( + helper.generateAddCommand(toBeAdded), + String.format(AddCommand.MESSAGE_SUCCESS, toBeAdded.getAsPrettyText()), + expectedTM, + expectedList); + + assertEquals(expectedList.indexOf(toBeAdded), targetedJumpIndex); + } @Test public void execute_edit_invalidArgsFormat_erroeMessageShown() throws Exception { @@ -334,6 +380,42 @@ public void execute_edit_successful() throws Exception { assertEquals(0, targetedJumpIndex); } + @Test + public void execute_editAfterSorting_successful() throws Exception { + TestDataHelper helper = new TestDataHelper(); + Task toBeEdited = helper.lancelot(); + model.addTask(helper.generateTask(2)); + model.addTask(helper.generateTask(3)); + model.addTask(toBeEdited); + + logic.execute("sort"); + + TaskManager expectedTM = new TaskManager(); + expectedTM.addTask(helper.generateTask(2)); + expectedTM.addTask(helper.generateTask(3)); + + HashMap> newProps = + toBeEdited.getPropertiesAsStrings(); + newProps.put(TaskProperties.DESC, Optional.of("Dinner with Guinevere")); + + Task newTask = new Task(newProps); + expectedTM.addTask(newTask); + + String editCommand = "edit 2 Dinner with Guinevere"; + + List expectedList = new ArrayList<>(expectedTM.getTaskList()); + expectedList.sort((t1, t2) -> t1.compareProperty(t2, TaskProperties.PRIORITY)); + + assertCommandBehavior( + editCommand, + String.format(EditCommand.MESSAGE_SUCCESS, newTask.getAsPrettyText()), + expectedTM, + expectedList + ); + + assertEquals(expectedList.indexOf(newTask), targetedJumpIndex); + } + @Test public void execute_done_invalidArgsFormat_errorMessageShown() throws Exception { @@ -518,6 +600,31 @@ public void execute_find_matchesIfAnyKeywordPresent() throws Exception { expectedAB, expectedList); } + + @Test + public void execute_findThenSort_successful() throws Exception { + TestDataHelper helper = new TestDataHelper(); + Task p1 = helper.generateTaskWithDesc("bla bla bla bla"); + Task p2 = helper.generateTaskWithDesc("bla KEY bla bceofeia"); + Task p3 = helper.generateTaskWithDesc("key key"); + Task p4 = helper.generateTaskWithDesc("KEy sduauo"); + + List fourTasks = helper.generateTaskList(p3, p1, p4, p2); + TaskManager expectedTM = helper.generateTaskManager(fourTasks); + helper.addToModel(model, fourTasks); + + + List expectedList = helper.generateTaskList(p3, p4, p2); + + assertCommandBehavior("find KEY", + Command.getMessageForTaskListShownSummary(expectedList.size()), + expectedTM, + expectedList); + + expectedList.sort((t1, t2) -> t1.compareProperty(t2, TaskProperties.PRIORITY)); + + assertCommandBehavior("sort", SortCommand.MESSAGE_SUCCESS, expectedTM, expectedList); + } /** From e12578f4063337cb7cca7a3cf5a65e780a62647d Mon Sep 17 00:00:00 2001 From: varung97 Date: Sun, 23 Oct 2016 19:19:38 +0800 Subject: [PATCH 6/6] Add guitest for sort --- src/test/java/guitests/EditCommandTest.java | 4 +- src/test/java/guitests/SortCommandTest.java | 56 +++++++++++++++++++ .../manager/testutil/TypicalTestTasks.java | 2 +- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/test/java/guitests/SortCommandTest.java diff --git a/src/test/java/guitests/EditCommandTest.java b/src/test/java/guitests/EditCommandTest.java index f01fb9f8b06b..55336fdcf6f9 100644 --- a/src/test/java/guitests/EditCommandTest.java +++ b/src/test/java/guitests/EditCommandTest.java @@ -46,8 +46,8 @@ public void edit() throws IllegalValueException { private void assertEditSuccess(String editCommand, int index, TestTask editedTask, TestTask... currentList) { commandBox.runCommand(String.format(editCommand, index)); - TaskCardHandle addedCard = taskListPanel.navigateToTask(editedTask.getDesc().get().getValue()); - assertMatching(editedTask, addedCard); + TaskCardHandle editedCard = taskListPanel.navigateToTask(editedTask.getDesc().get().getValue()); + assertMatching(editedTask, editedCard); TestTask[] expectedList = TestUtil.addTasksToList(TestUtil.removeTaskFromList(currentList, index), editedTask); assertTrue(taskListPanel.isListMatching(expectedList)); diff --git a/src/test/java/guitests/SortCommandTest.java b/src/test/java/guitests/SortCommandTest.java new file mode 100644 index 000000000000..a6651e59085c --- /dev/null +++ b/src/test/java/guitests/SortCommandTest.java @@ -0,0 +1,56 @@ +package guitests; + +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +import org.junit.Test; + +import guitests.guihandles.TaskCardHandle; +import javafx.collections.ObservableList; +import seedu.manager.logic.commands.SortCommand; +import seedu.manager.model.task.ReadOnlyTask; +import seedu.manager.model.task.Task.TaskProperties; +import seedu.manager.testutil.TestTask; + +public class SortCommandTest extends TaskManagerGuiTest { + + @Test + public void sort() { + assertSortSuccess(true); + + TestTask taskToAdd = td.hotel; + commandBox.runCommand(taskToAdd.getAddCommand()); + + assertSortSuccess(false); + + commandBox.runCommand("find CS2101"); + assertSortSuccess(true); + } + + private void assertSortSuccess(boolean runSortCommand) { + if (runSortCommand) { + commandBox.runCommand("sort"); + } + + Comparator priorityComparator = (t1, t2) -> t1.compareProperty(t2, TaskProperties.PRIORITY); + + assertTrue(isSorted(priorityComparator, taskListPanel.getListView().getItems())); + + if (runSortCommand) { + assertResultMessage(SortCommand.MESSAGE_SUCCESS); + } + } + + private boolean isSorted(Comparator comparator, ObservableList listToCheck) { + for (int i = 1; i < listToCheck.size(); i++) { + if (comparator.compare(listToCheck.get(i - 1), listToCheck.get(i)) > 0) { + return false; + } + } + return true; + } +} diff --git a/src/test/java/seedu/manager/testutil/TypicalTestTasks.java b/src/test/java/seedu/manager/testutil/TypicalTestTasks.java index 52fb32a3a5d7..139be25e6dad 100644 --- a/src/test/java/seedu/manager/testutil/TypicalTestTasks.java +++ b/src/test/java/seedu/manager/testutil/TypicalTestTasks.java @@ -13,7 +13,7 @@ public class TypicalTestTasks { public TypicalTestTasks() { try { - alpha = new TaskBuilder().withDesc("Do CS2101 UG").withPriority("high") + alpha = new TaskBuilder().withDesc("Do CS2101 UG").withPriority("med") .withStartTime("8:00pm").withEndTime("9:30pm").withVenue("School of Computing").withDone("No") .build(); beta = new TaskBuilder().withDesc("Do CS2101 DG").withPriority("high")