Skip to content

Commit

Permalink
Merge pull request #99 from m1oojv/megan/filter-task-by-status
Browse files Browse the repository at this point in the history
feat: Filter task list by task status
  • Loading branch information
freshcabbage123 authored Oct 27, 2023
2 parents 21bf265 + 785d3dc commit 9d66aa2
Show file tree
Hide file tree
Showing 12 changed files with 204 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import seedu.address.model.Model;
import seedu.address.model.tag.Tag;
import seedu.address.model.task.Note;
import seedu.address.model.task.Status;
import seedu.address.model.task.Task;
import seedu.address.model.task.Title;

Expand Down Expand Up @@ -91,9 +92,10 @@ private static Task createEditedTask(Task taskToEdit, EditTaskDescriptor editTas

Title updatedTitle = editTaskDescriptor.getTitle().orElse(taskToEdit.getTitle());
Note updatedNote = editTaskDescriptor.getNote().orElse(taskToEdit.getNote());
Status taskStatus = taskToEdit.getStatus();
Set<Tag> updatedTags = editTaskDescriptor.getTags().orElse(taskToEdit.getTags());

return new Task(updatedTitle, updatedNote, updatedTags);
return new Task(updatedTitle, updatedNote, taskStatus, updatedTags);
}

@Override
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/seedu/address/logic/commands/FindDoneCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.model.Model.PREDICATE_SHOW_DONE_TASKS;

import seedu.address.logic.Messages;
import seedu.address.model.Model;
import seedu.address.model.task.Status;

/**
* Finds and lists all task in address book whose status is {@link Status#STATUS_DONE}.
*/
public class FindDoneCommand extends Command {

public static final String COMMAND_WORD = "findDone";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Finds all tasks whose status is marked as "
+ "done and displays them as a list with index numbers.\n"
+ "Example: " + COMMAND_WORD;

public FindDoneCommand() {}

@Override
public CommandResult execute(Model model) {
requireNonNull(model);
model.updateFilteredTaskList(PREDICATE_SHOW_DONE_TASKS);
return new CommandResult(
String.format(Messages.MESSAGE_TASKS_LISTED_OVERVIEW, model.getFilteredTaskList().size()));
}
}
30 changes: 30 additions & 0 deletions src/main/java/seedu/address/logic/commands/FindNotDoneCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.model.Model.PREDICATE_SHOW_NOT_DONE_TASKS;

import seedu.address.logic.Messages;
import seedu.address.model.Model;
import seedu.address.model.task.Status;

/**
* Finds and lists all task in address book whose status is {@link Status#STATUS_NOT_DONE}.
*/
public class FindNotDoneCommand extends Command {

public static final String COMMAND_WORD = "findNotDone";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Finds all tasks whose status is marked as "
+ "not done and displays them as a list with index numbers.\n"
+ "Example: " + COMMAND_WORD;

public FindNotDoneCommand() {}

@Override
public CommandResult execute(Model model) {
requireNonNull(model);
model.updateFilteredTaskList(PREDICATE_SHOW_NOT_DONE_TASKS);
return new CommandResult(
String.format(Messages.MESSAGE_TASKS_LISTED_OVERVIEW, model.getFilteredTaskList().size()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import seedu.address.logic.commands.EditPersonCommand;
import seedu.address.logic.commands.EditTaskCommand;
import seedu.address.logic.commands.ExitCommand;
import seedu.address.logic.commands.FindDoneCommand;
import seedu.address.logic.commands.FindNotDoneCommand;
import seedu.address.logic.commands.FindPersonCommand;
import seedu.address.logic.commands.FindTaskCommand;
import seedu.address.logic.commands.HelpCommand;
Expand Down Expand Up @@ -100,6 +102,12 @@ public Command parseCommand(String userInput) throws ParseException {
case FindTaskCommand.COMMAND_WORD:
return new FindTaskCommandParser().parse(arguments);

case FindDoneCommand.COMMAND_WORD:
return new FindDoneCommand();

case FindNotDoneCommand.COMMAND_WORD:
return new FindNotDoneCommand();

case DeleteAllTaskCommand.COMMAND_WORD:
return new DeleteAllTaskCommand();

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/seedu/address/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import javafx.collections.ObservableList;
import seedu.address.commons.core.GuiSettings;
import seedu.address.model.person.Person;
import seedu.address.model.task.Status;
import seedu.address.model.task.Task;

/**
Expand All @@ -17,6 +18,8 @@ public interface Model {
*/
Predicate<Person> PREDICATE_SHOW_ALL_PERSONS = unused -> true;
Predicate<Task> PREDICATE_SHOW_ALL_TASKS = unused -> true;
Predicate<Task> PREDICATE_SHOW_DONE_TASKS = task -> task.getStatus().equals(Status.STATUS_DONE);
Predicate<Task> PREDICATE_SHOW_NOT_DONE_TASKS = task -> task.getStatus().equals(Status.STATUS_NOT_DONE);

/**
* Returns the user prefs.
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/seedu/address/model/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public Task(Title title, Note note, Set<Tag> tags) {
requireAllNonNull(title, note, tags);
this.title = title;
this.note = note;
this.status = new Status(Status.TaskStatus.NOT_DONE);
this.status = Status.STATUS_NOT_DONE;
this.tags.addAll(tags);
}

Expand Down Expand Up @@ -67,14 +67,14 @@ public Status getStatus() {
* Updates the Status of the Task as Done.
*/
public Task markDone() {
return new Task(title, note, new Status(Status.TaskStatus.DONE), tags);
return new Task(title, note, Status.STATUS_DONE, tags);
}

/**
* Updates the Status of the Task as not Done.
*/
public Task unmarkDone() {
return new Task(title, note, new Status(Status.TaskStatus.NOT_DONE), tags);
return new Task(title, note, Status.STATUS_NOT_DONE, tags);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package seedu.address.logic.commands;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static seedu.address.logic.Messages.MESSAGE_TASKS_LISTED_OVERVIEW;
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
import static seedu.address.model.Model.PREDICATE_SHOW_DONE_TASKS;
import static seedu.address.testutil.TypicalTasks.BUDGET;
import static seedu.address.testutil.TypicalTasks.ENTERTAINMENT;
import static seedu.address.testutil.TypicalTasks.FUNDING;
import static seedu.address.testutil.TypicalTasks.GUESTLIST;
import static seedu.address.testutil.TypicalTasks.HOSPITALITY;
import static seedu.address.testutil.TypicalTasks.getTypicalAddressBook;

import java.util.Arrays;
import java.util.Collections;

import org.junit.jupiter.api.Test;

import seedu.address.model.Model;
import seedu.address.model.ModelManager;
import seedu.address.model.UserPrefs;
import seedu.address.model.task.Task;

/**
* Contains integration tests (interaction with the Model) for {@code FindDoneCommand}.
*/
public class FindDoneCommandTest {
private final Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
private final Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs());

@Test
public void execute_noTasksFound() {
String expectedMessage = String.format(MESSAGE_TASKS_LISTED_OVERVIEW, 0);
FindDoneCommand command = new FindDoneCommand();
for (Task task : expectedModel.getFilteredTaskList()) {
expectedModel.unmarkTask(task);
model.unmarkTask(task);
}
expectedModel.updateFilteredTaskList(PREDICATE_SHOW_DONE_TASKS);
assertCommandSuccess(command, model, expectedMessage, expectedModel);
assertEquals(Collections.emptyList(), model.getFilteredTaskList());
}

@Test
public void execute_multipleTasksFound() {
String expectedMessage = String.format(MESSAGE_TASKS_LISTED_OVERVIEW, 5);
FindDoneCommand command = new FindDoneCommand();
expectedModel.updateFilteredTaskList(PREDICATE_SHOW_DONE_TASKS);
assertCommandSuccess(command, model, expectedMessage, expectedModel);
assertEquals(Arrays.asList(BUDGET, ENTERTAINMENT, FUNDING, GUESTLIST, HOSPITALITY),
model.getFilteredTaskList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package seedu.address.logic.commands;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static seedu.address.logic.Messages.MESSAGE_TASKS_LISTED_OVERVIEW;
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
import static seedu.address.model.Model.PREDICATE_SHOW_NOT_DONE_TASKS;
import static seedu.address.testutil.TypicalTasks.AGENDA;
import static seedu.address.testutil.TypicalTasks.CATERING;
import static seedu.address.testutil.TypicalTasks.DRAFT;
import static seedu.address.testutil.TypicalTasks.INVITATION;
import static seedu.address.testutil.TypicalTasks.getTypicalAddressBook;

import java.util.Arrays;
import java.util.Collections;

import org.junit.jupiter.api.Test;

import seedu.address.model.Model;
import seedu.address.model.ModelManager;
import seedu.address.model.UserPrefs;
import seedu.address.model.task.Task;

/**
* Contains integration tests (interaction with the Model) for {@code FindNotDoneCommand}.
*/
public class FindNotDoneCommandTest {
private final Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
private final Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs());

@Test
public void execute_noTasksFound() {
String expectedMessage = String.format(MESSAGE_TASKS_LISTED_OVERVIEW, 0);
FindNotDoneCommand command = new FindNotDoneCommand();
for (Task task : expectedModel.getFilteredTaskList()) {
expectedModel.markTask(task);
model.markTask(task);
}
expectedModel.updateFilteredTaskList(PREDICATE_SHOW_NOT_DONE_TASKS);
assertCommandSuccess(command, model, expectedMessage, expectedModel);
assertEquals(Collections.emptyList(), model.getFilteredTaskList());
}

@Test
public void execute_multipleTasksFound() {
String expectedMessage = String.format(MESSAGE_TASKS_LISTED_OVERVIEW, 4);
FindNotDoneCommand command = new FindNotDoneCommand();
expectedModel.updateFilteredTaskList(PREDICATE_SHOW_NOT_DONE_TASKS);
assertCommandSuccess(command, model, expectedMessage, expectedModel);
assertEquals(Arrays.asList(AGENDA, CATERING, DRAFT, INVITATION),
model.getFilteredTaskList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import seedu.address.logic.commands.EditTaskCommand;
import seedu.address.logic.commands.EditTaskCommand.EditTaskDescriptor;
import seedu.address.logic.commands.ExitCommand;
import seedu.address.logic.commands.FindDoneCommand;
import seedu.address.logic.commands.FindNotDoneCommand;
import seedu.address.logic.commands.FindPersonCommand;
import seedu.address.logic.commands.FindTaskCommand;
import seedu.address.logic.commands.HelpCommand;
Expand Down Expand Up @@ -122,6 +124,18 @@ public void parseCommand_findTask() throws Exception {
assertEquals(new FindTaskCommand(new TaskContainsKeywordsPredicate(keywords)), command);
}

@Test
public void parseCommand_findDone() throws Exception {
assertTrue(parser.parseCommand(FindDoneCommand.COMMAND_WORD) instanceof FindDoneCommand);
assertTrue(parser.parseCommand(FindDoneCommand.COMMAND_WORD + " 3") instanceof FindDoneCommand);
}

@Test
public void parseCommand_findNotDone() throws Exception {
assertTrue(parser.parseCommand(FindNotDoneCommand.COMMAND_WORD) instanceof FindNotDoneCommand);
assertTrue(parser.parseCommand(FindNotDoneCommand.COMMAND_WORD + " 3") instanceof FindNotDoneCommand);
}

@Test
public void parseCommand_markTask() throws Exception {
MarkTaskCommand command = (MarkTaskCommand) parser.parseCommand(
Expand Down
10 changes: 4 additions & 6 deletions src/test/java/seedu/address/model/ModelManagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import seedu.address.commons.core.GuiSettings;
import seedu.address.model.person.NameContainsKeywordsPredicate;
import seedu.address.model.task.Status;
import seedu.address.model.task.Status.TaskStatus;
import seedu.address.model.task.Task;
import seedu.address.testutil.AddressBookBuilder;

Expand Down Expand Up @@ -118,9 +117,9 @@ public void markTask_validTask_success() {
modelManager.addTask(AGENDA);
Task markedTask = modelManager.markTask(AGENDA);

assertTrue(markedTask.getStatus().equals(new Status(TaskStatus.DONE)));
assertTrue(markedTask.getStatus().equals(Status.STATUS_DONE));

assertTrue(modelManager.getFilteredTaskList().get(0).getStatus().equals(new Status(TaskStatus.DONE)));
assertTrue(modelManager.getFilteredTaskList().get(0).getStatus().equals(Status.STATUS_DONE));
}

@Test
Expand All @@ -129,10 +128,9 @@ public void unmarkTask_validTask_success() {
Task markedTask = modelManager.markTask(AGENDA);
Task unmarkedTask = modelManager.unmarkTask(markedTask);

assertTrue(unmarkedTask.getStatus().equals(new Status(TaskStatus.NOT_DONE)));
assertTrue(unmarkedTask.getStatus().equals(Status.STATUS_NOT_DONE));

assertTrue(modelManager.getFilteredTaskList().get(0).getStatus().equals(
new Status(TaskStatus.NOT_DONE)));
assertTrue(modelManager.getFilteredTaskList().get(0).getStatus().equals(Status.STATUS_NOT_DONE));
}

@Test
Expand Down
6 changes: 3 additions & 3 deletions src/test/java/seedu/address/model/task/TaskTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@
public class TaskTest {

private static final Task TEST_TASK = new Task(new Title("Test Task 1"), new Note("Test Note 1"),
new Status(Status.TaskStatus.DONE), getTagSet("Test1"));
Status.STATUS_DONE, getTagSet("Test1"));
private static final Task TEST_TASK_SAME = new Task(new Title("Test Task 1"), new Note("Test Note 1"),
new Status(Status.TaskStatus.DONE), getTagSet("Test1"));
Status.STATUS_DONE, getTagSet("Test1"));
private static final Task TEST_TASK_TITLE = new Task(new Title("Test Task 1"), new Note("Test Note 2"), getTagSet(
"Test2"));
private static final Task TEST_TASK_NOTE = new Task(new Title("Test Task 1"), new Note("Test Note 1"), getTagSet(
"Test2"));
private static final Task TEST_TASK_STATUS = new Task(new Title("Test Task 1"), new Note("Test Note 1"),
new Status(Status.TaskStatus.DONE), getTagSet("Test2"));
Status.STATUS_DONE, getTagSet("Test2"));
private static final Task TEST_TASK_DIFFERENT = new Task(new Title("Test Task 2"), new Note("Test Note 2"),
getTagSet("Test2"));

Expand Down
3 changes: 1 addition & 2 deletions src/test/java/seedu/address/testutil/TaskBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import seedu.address.model.tag.Tag;
import seedu.address.model.task.Note;
import seedu.address.model.task.Status;
import seedu.address.model.task.Status.TaskStatus;
import seedu.address.model.task.Task;
import seedu.address.model.task.Title;
import seedu.address.model.util.SampleDataUtil;
Expand All @@ -30,7 +29,7 @@ public class TaskBuilder {
public TaskBuilder() {
title = new Title(DEFAULT_TITLE);
note = new Note(DEFAULT_NOTE);
status = new Status(TaskStatus.NOT_DONE);
status = Status.STATUS_NOT_DONE;
tags = new HashSet<>();
}

Expand Down

0 comments on commit 9d66aa2

Please sign in to comment.