diff --git a/src/main/java/seedu/manager/commons/core/CommandWord.java b/src/main/java/seedu/manager/commons/core/CommandWord.java index 7dff748fb67a..2e544345a5ac 100644 --- a/src/main/java/seedu/manager/commons/core/CommandWord.java +++ b/src/main/java/seedu/manager/commons/core/CommandWord.java @@ -10,9 +10,9 @@ public class CommandWord { public enum Commands { ADD("add"), EDIT("edit"), DELETE("delete"), UNDO("undo"), FIND("find"), STORAGE("storage"), CLEAR("clear"), DONE("done"), - EXIT("exit"), HELP("help"), LIST("list"), SORT("sort"), - UNSORT("unsort"), ALIAS("alias"), BY("by"), AT("at"), - EVENT("from"), PRIORITY("priority"), TAG("tag"), VENUE("venue"); + EXIT("exit"), HELP("help"), LIST("list"), SORTBY("sortby"), + ALIAS("alias"), BY("by"), AT("at"), EVENT("from"), + PRIORITY("priority"), TAG("tag"), VENUE("venue"); private String commandRep; diff --git a/src/main/java/seedu/manager/logic/commands/HelpCommand.java b/src/main/java/seedu/manager/logic/commands/HelpCommand.java index 7cb5e8f485e0..98a2e8c1fb7b 100644 --- a/src/main/java/seedu/manager/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/manager/logic/commands/HelpCommand.java @@ -81,9 +81,8 @@ private static void buildUsageMessageHashmap() { usageMessages.put(Commands.FIND, FindCommand.MESSAGE_USAGE); usageMessages.put(Commands.HELP, HelpCommand.MESSAGE_USAGE); usageMessages.put(Commands.LIST, ListCommand.MESSAGE_USAGE); - usageMessages.put(Commands.SORT, SortCommand.MESSAGE_USAGE); + usageMessages.put(Commands.SORTBY, SortCommand.MESSAGE_USAGE); usageMessages.put(Commands.STORAGE, StorageCommand.MESSAGE_USAGE); - usageMessages.put(Commands.UNSORT, UnSortCommand.MESSAGE_USAGE); usageMessages.put(Commands.UNDO, UndoCommand.MESSAGE_USAGE); usageMessages.put(Commands.AT, MESSAGE_AT_USAGE); diff --git a/src/main/java/seedu/manager/logic/commands/SortCommand.java b/src/main/java/seedu/manager/logic/commands/SortCommand.java index 3af4b7b0eee8..1cfe6fb323e3 100644 --- a/src/main/java/seedu/manager/logic/commands/SortCommand.java +++ b/src/main/java/seedu/manager/logic/commands/SortCommand.java @@ -5,28 +5,52 @@ * Allows user to sort the displayed tasks by priority * */ -public class SortCommand extends Command implements UndoableCommand{ - public static final String COMMAND_WORD = "sort"; +public class SortCommand extends Command { + public static final String COMMAND_WORD = "sortby"; 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" + "Example: " + COMMAND_WORD; - public static final String MESSAGE_SUCCESS = "Sorted task list."; - public static final String UNDO_SUCCESS = "Unsorted task list."; + public static final String MESSAGE_SUCCESS = "Sorted task list by %1$s"; + public static final String UNDO_SUCCESS = "Unsorted task list"; + public static final String MESSAGE_NOT_A_COMPARATOR = "This is not a valid property to sort by"; - public SortCommand() {} + public static enum SortComparators { + TIME("time"), PRIORITY("priority"); + + private String value; + + private SortComparators(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } + + private SortComparators comparator; + + public SortCommand(SortComparators comparator) { + this.comparator = comparator; + } @Override public CommandResult execute() { - model.sortSortedFilteredTaskListByPriority(); - this.addUndo(this); - return new CommandResult(MESSAGE_SUCCESS); - } + switch (comparator) { + case PRIORITY: + model.sortSortedFilteredTaskListByPriority(); + break; + + case TIME: + model.sortSortedFilteredTaskListByTime(); + break; - @Override - public CommandResult undoIt() { - model.sortSortedFilteredTaskListByTime(); - return new CommandResult(UNDO_SUCCESS); + default: + return new CommandResult(MESSAGE_NOT_A_COMPARATOR); + } + + return new CommandResult(String.format(MESSAGE_SUCCESS, comparator.getValue())); } } diff --git a/src/main/java/seedu/manager/logic/commands/UnSortCommand.java b/src/main/java/seedu/manager/logic/commands/UnSortCommand.java deleted file mode 100644 index efd7039c3eb6..000000000000 --- a/src/main/java/seedu/manager/logic/commands/UnSortCommand.java +++ /dev/null @@ -1,32 +0,0 @@ -package seedu.manager.logic.commands; - -// @@author A0147924X -/** - * Allows user to unsort the displayed tasks, placing completed tasks at the bottom - * - */ -public class UnSortCommand extends Command implements UndoableCommand { - public static final String COMMAND_WORD = "unsort"; - - public static final String MESSAGE_USAGE = COMMAND_WORD - + ": Unsorts the task list, moving done tasks to the bottom.\n" - + "Example: " + COMMAND_WORD; - - public static final String MESSAGE_SUCCESS = "Unsorted task list."; - public static final String UNDO_SUCCESS = "Sorted task list."; - - public UnSortCommand() {} - - @Override - public CommandResult execute() { - model.sortSortedFilteredTaskListByTime(); - this.addUndo(this); - return new CommandResult(MESSAGE_SUCCESS); - } - - @Override - public CommandResult undoIt() { - model.sortSortedFilteredTaskListByPriority(); - return new CommandResult(UNDO_SUCCESS); - } -} diff --git a/src/main/java/seedu/manager/logic/commands/UndoCommand.java b/src/main/java/seedu/manager/logic/commands/UndoCommand.java index 04431b8526eb..2a0d65590e74 100644 --- a/src/main/java/seedu/manager/logic/commands/UndoCommand.java +++ b/src/main/java/seedu/manager/logic/commands/UndoCommand.java @@ -7,7 +7,7 @@ public class UndoCommand extends Command { public static final String NO_UNDOABLE_COMMANDS = "Sorry, there are no commands to undo"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Undo your last undoable step, " - + "e.g. add, delete, edit, done, alias and sort.\n" + + "e.g. add, delete, edit, done and alias.\n" + "Example: " + COMMAND_WORD; public static final String SHOWING_UNDO_MESSAGE = "Typed in \"undo\" to the input box."; diff --git a/src/main/java/seedu/manager/logic/parser/Parser.java b/src/main/java/seedu/manager/logic/parser/Parser.java index 121348f75dae..e2f4b2e92296 100644 --- a/src/main/java/seedu/manager/logic/parser/Parser.java +++ b/src/main/java/seedu/manager/logic/parser/Parser.java @@ -109,11 +109,8 @@ public Command parseCommand(String userInput) { case STORAGE: return new StorageCommand(arguments); - case SORT: - return new SortCommand(); - - case UNSORT: - return new UnSortCommand(); + case SORTBY: + return prepareSort(arguments); case UNDO: return new UndoCommand(); @@ -262,6 +259,7 @@ private Command prepareFind(String args) { */ private Command prepareAlias(String args) { String[] splitArgs = args.trim().split(" "); + if (splitArgs.length != 2) { return new IncorrectCommand(AliasCommand.MESSAGE_WRONG_NUM_ARGS); } @@ -276,6 +274,7 @@ private Command prepareAlias(String args) { */ private Command prepareHelp(String args) { String[] splitArgs = args.trim().split(" "); + if (splitArgs.length > 1) { return new IncorrectCommand(HelpCommand.MESSAGE_WRONG_NUM_ARGS); } else if (splitArgs.length == 1 && !splitArgs[0].equals("")) { @@ -284,4 +283,16 @@ private Command prepareHelp(String args) { return new HelpCommand(Optional.empty()); } } + + private Command prepareSort(String args) { + args = args.trim(); + + for (SortCommand.SortComparators comparator : SortCommand.SortComparators.values()) { + if (args.equals(comparator.getValue())) { + return new SortCommand(comparator); + } + } + + return new IncorrectCommand(SortCommand.MESSAGE_NOT_A_COMPARATOR); + } } \ No newline at end of file diff --git a/src/main/java/seedu/manager/model/Model.java b/src/main/java/seedu/manager/model/Model.java index 34a05cb1cc3e..0530bf42124b 100644 --- a/src/main/java/seedu/manager/model/Model.java +++ b/src/main/java/seedu/manager/model/Model.java @@ -86,10 +86,10 @@ public void setSingleCommandWord(String commandToChange, String alias, void updateFilteredTaskList(HashMap> propertiesToMatch); // @@author A0147924X - /** Sorts the sorted and filtered task list by a certain property */ + /** Sorts the sorted and filtered task list by priority */ void sortSortedFilteredTaskListByPriority(); - /** Unsorts the sorted and filtered task list */ + /** Sorts the sorted and filtered task list by time */ void sortSortedFilteredTaskListByTime(); /** diff --git a/src/main/java/seedu/manager/model/UserPrefs.java b/src/main/java/seedu/manager/model/UserPrefs.java index 3d65594833fe..86c8341f141b 100644 --- a/src/main/java/seedu/manager/model/UserPrefs.java +++ b/src/main/java/seedu/manager/model/UserPrefs.java @@ -31,20 +31,22 @@ public void updateLastUsedGuiSetting(GuiSettings guiSettings) { // @@author A0147924X public UserPrefs(){ this.setGuiSettings(500, 500, 0, 0); + this.setCommandWords( new Commands[]{ Commands.ADD, Commands.EDIT, Commands.DELETE, Commands.UNDO, Commands.FIND, Commands.STORAGE, Commands.CLEAR, Commands.DONE, - Commands.EXIT, Commands.HELP, Commands.LIST, Commands.SORT, - Commands.UNSORT, Commands.ALIAS + Commands.EXIT, Commands.HELP, Commands.LIST, Commands.SORTBY, + Commands.ALIAS }, new String[]{ "add", "edit", "delete", "undo", "find", "storage", "clear", "done", - "exit", "help", "list", "sort", - "unsort", "alias" + "exit", "help", "list", "sortby", + "alias" } ); + this.setExtensionsWords( new Commands[]{ Commands.BY, Commands.AT, Commands.EVENT, Commands.PRIORITY, diff --git a/src/test/java/guitests/SortCommandTest.java b/src/test/java/guitests/SortCommandTest.java index 551d79f7da93..fe36281460c1 100644 --- a/src/test/java/guitests/SortCommandTest.java +++ b/src/test/java/guitests/SortCommandTest.java @@ -8,47 +8,78 @@ import javafx.collections.ObservableList; import seedu.manager.logic.commands.SortCommand; +import seedu.manager.logic.commands.SortCommand.SortComparators; import seedu.manager.model.task.ReadOnlyTask; import seedu.manager.testutil.TestTask; // @@author A0147924X public class SortCommandTest extends TaskManagerGuiTest { + private Comparator priorityComparator = (t1, t2) -> { + int doneCompare = t1.compareDone(t2); + if (doneCompare != 0) { + return doneCompare; + } else { + return t1.comparePriority(t2); + } + }; + + private Comparator timeComparator = (t1, t2) -> { + int doneCompare = t1.compareDone(t2); + if (doneCompare != 0) { + return doneCompare; + } else { + return t1.compareTime(t2); + } + }; + + @Test + public void sortByTime() { + runSortTest(SortComparators.TIME); + } + @Test - public void sort() { - assertSortSuccess(true); + public void sortByPriority() { + runSortTest(SortComparators.PRIORITY); + } + + private void runSortTest(SortComparators comparator) { + assertSortSuccess(true, comparator); TestTask taskToAdd = td.hotel; commandBox.runCommand(taskToAdd.getAddCommand()); - assertSortSuccess(false); + assertSortSuccess(false, comparator); commandBox.runCommand("find CS2101"); - assertSortSuccess(true); + assertSortSuccess(true, comparator); } /** * Asserts that the sort command worked * @param shouldRunSortCommand Whether the sort command should be run or not */ - private void assertSortSuccess(boolean shouldRunSortCommand) { + private void assertSortSuccess(boolean shouldRunSortCommand, SortComparators comparator) { if (shouldRunSortCommand) { - commandBox.runCommand("sort"); + commandBox.runCommand(String.format("sortby %1$s", comparator.getValue())); } - Comparator priorityComparator = (t1, t2) -> { - int doneCompare = t1.compareDone(t2); - if (doneCompare != 0) { - return doneCompare; - } else { - return t1.comparePriority(t2); - } - }; - - assertTrue(isSorted(priorityComparator, taskListPanel.getListView().getItems())); + switch (comparator) { + case PRIORITY: + assertTrue(isSorted(priorityComparator, taskListPanel.getListView().getItems())); + break; + + case TIME: + assertTrue(isSorted(timeComparator, taskListPanel.getListView().getItems())); + break; + + default: + assert false; + break; + } if (shouldRunSortCommand) { - assertResultMessage(SortCommand.MESSAGE_SUCCESS); + assertResultMessage(String.format(SortCommand.MESSAGE_SUCCESS, comparator.getValue())); } } diff --git a/src/test/java/guitests/UnSortCommandTest.java b/src/test/java/guitests/UnSortCommandTest.java deleted file mode 100644 index eda0ee974022..000000000000 --- a/src/test/java/guitests/UnSortCommandTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package guitests; - -import static org.junit.Assert.assertTrue; - -import java.util.Comparator; - -import org.junit.Test; - -import javafx.collections.ObservableList; -import seedu.manager.logic.commands.UnSortCommand; -import seedu.manager.model.task.ReadOnlyTask; -import seedu.manager.testutil.TestTask; - -//@@author A0147924X -public class UnSortCommandTest extends TaskManagerGuiTest { - - @Test - public void unsort() { - assertUnSortSuccess(false); - - TestTask taskToAdd = td.hotel; - commandBox.runCommand(taskToAdd.getAddCommand()); - - assertUnSortSuccess(false); - - commandBox.runCommand("done 1"); - assertUnSortSuccess(false); - - commandBox.runCommand("sort"); - assertUnSortSuccess(true); - } - - /** - * Asserts that the unsort command worked - * @param shouldRunUnSortCommand Whether the unsort command should be run or not - */ - private void assertUnSortSuccess(boolean shouldRunUnSortCommand) { - if (shouldRunUnSortCommand) { - commandBox.runCommand("unsort"); - } - - Comparator priorityComparator = (t1, t2) -> { - int doneCompare = t1.compareDone(t2); - if (doneCompare != 0) { - return doneCompare; - } else { - return t1.compareTime(t2); - } - }; - - assertTrue(isSorted(priorityComparator, taskListPanel.getListView().getItems())); - - if (shouldRunUnSortCommand) { - assertResultMessage(UnSortCommand.MESSAGE_SUCCESS); - } - } - - /** - * Uses a comparator to check whether a given list is sorted or not - * @param comparator The comparator which decides ordering of the tasks - * @param listToCheck The list which will be checked - * @return True if list is sorted, else False - */ - 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/logic/LogicManagerTest.java b/src/test/java/seedu/manager/logic/LogicManagerTest.java index 65997c48b5f4..1ef995d212ca 100644 --- a/src/test/java/seedu/manager/logic/LogicManagerTest.java +++ b/src/test/java/seedu/manager/logic/LogicManagerTest.java @@ -13,6 +13,7 @@ import seedu.manager.logic.Logic; import seedu.manager.logic.LogicManager; import seedu.manager.logic.commands.*; +import seedu.manager.logic.commands.SortCommand.SortComparators; import seedu.manager.logic.parser.ExtensionParser; import seedu.manager.model.TaskManager; import seedu.manager.model.Model; @@ -194,9 +195,24 @@ public void execute_sort_successful() throws Exception { expectedTM.addTask(helper.generateTask(3)); List expectedList = new ArrayList<>(expectedTM.getTaskList()); + + SortComparators comparator = SortComparators.PRIORITY; expectedList.sort((t1, t2) -> t1.comparePriority(t2)); - assertCommandBehavior("sort", SortCommand.MESSAGE_SUCCESS, expectedTM, expectedList); + assertCommandBehavior( + String.format("sortby %1$s", comparator.getValue()), + String.format(SortCommand.MESSAGE_SUCCESS, comparator.getValue()), + expectedTM, + expectedList); + + comparator = SortComparators.TIME; + expectedList.sort((t1, t2) -> t1.compareTime(t2)); + + assertCommandBehavior( + String.format("sortby %1$s", comparator.getValue()), + String.format(SortCommand.MESSAGE_SUCCESS, comparator.getValue()), + expectedTM, + expectedList); } @@ -322,7 +338,7 @@ public void execute_addAfterSorting_successful() throws Exception { List expectedList = new ArrayList<>(expectedTM.getTaskList()); expectedList.sort((t1, t2) -> t1.comparePriority(t2)); - logic.execute("sort"); + logic.execute("sortby priority"); assertCommandBehavior( helper.generateAddCommand(toBeAdded), @@ -458,7 +474,7 @@ public void execute_editAfterSorting_successful() throws Exception { model.addTask(helper.generateTask(3)); model.addTask(toBeEdited); - logic.execute("sort"); + logic.execute("sortby priority"); TaskManager expectedTM = new TaskManager(); expectedTM.addTask(helper.generateTask(2)); @@ -683,10 +699,10 @@ public void execute_find_matchesIfAnyKeywordPresent() throws Exception { @Test public void execute_findThenSort_successful() throws Exception { TestDataHelper helper = new TestDataHelper(); - Task t1 = helper.generateTaskWithDesc("bla bla bla bla"); - Task t2 = helper.generateTaskWithDesc("bla KEY bla bceofeia"); - Task t3 = helper.generateTaskWithDesc("key key"); - Task t4 = helper.generateTaskWithDesc("KEy sduauo"); + Task t1 = helper.generateTaskWithDescAndPriority("bla bla bla bla", "high"); + Task t2 = helper.generateTaskWithDescAndPriority("bla KEY bla bceofeia", "med"); + Task t3 = helper.generateTaskWithDescAndPriority("key key", "low"); + Task t4 = helper.generateTaskWithDescAndPriority("KEy sduauo", ""); List fourTasks = helper.generateTaskList(t3, t1, t4, t2); TaskManager expectedTM = helper.generateTaskManager(fourTasks); @@ -694,6 +710,7 @@ public void execute_findThenSort_successful() throws Exception { List expectedList = helper.generateTaskList(t3, t4, t2); + SortComparators comparator = SortComparators.PRIORITY; assertCommandBehavior("find KEY", Command.getMessageForTaskListShownSummary(expectedList.size()), @@ -702,7 +719,11 @@ public void execute_findThenSort_successful() throws Exception { expectedList.sort((task1, task2) -> task1.comparePriority(task2)); - assertCommandBehavior("sort", SortCommand.MESSAGE_SUCCESS, expectedTM, expectedList); + assertCommandBehavior( + String.format("sortby %1$s", comparator.getValue()), + String.format(SortCommand.MESSAGE_SUCCESS, comparator.getValue()), + expectedTM, + expectedList); } // @@author @@ -1251,5 +1272,24 @@ Task generateTaskWithTagAndDesc(String desc, String tag) throws Exception { tag ); } + + /** + * Generates a Task object with given tag. Other fields will have some dummy values. + * @param desc Description for the task + * @param priority Priority for the task + * @return Task with the given parameters + * @throws Exception + */ + Task generateTaskWithDescAndPriority(String desc, String priority) throws Exception { + return new Task( + desc, + "Camelot", + priority, + "4.30am", + "7am", + "", + "" + ); + } } }