From 2caf6277b1bc7519cf280499ddcceeb2b8214f6c Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Wed, 13 Mar 2024 04:48:01 +0800 Subject: [PATCH 01/13] Create Task class Create the Task class to represent the tasks for the user to add to the app. --- .../java/seedu/address/model/task/Task.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/seedu/address/model/task/Task.java diff --git a/src/main/java/seedu/address/model/task/Task.java b/src/main/java/seedu/address/model/task/Task.java new file mode 100644 index 00000000000..033178e9533 --- /dev/null +++ b/src/main/java/seedu/address/model/task/Task.java @@ -0,0 +1,24 @@ +package seedu.address.model.task; + +/** + * The representation of a task added by the user. + */ +public class Task { + private String description; + + /** + * The constructor of the class. + * @param description Description of the task. + */ + public Task(String description) { + this.description = description; + } + + /** + * Gets the description of a task. + * @return The description of the task. + */ + public String getDescription() { + return description; + } +} From 815607a21ca22ad773a12d6be0f2d0db26d6ce6c Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Wed, 13 Mar 2024 05:34:38 +0800 Subject: [PATCH 02/13] Create AddTaskCommand and AddTaskCommandParser classes Let's create an AddTaskCommand class to represent the command that adds a task to the book. Let's create an AddTaskCommand Parser class to process the user input for an add task command. --- .../logic/commands/AddTaskCommand.java | 57 +++++++++++++++++++ .../logic/parser/AddTaskCommandParser.java | 18 ++++++ 2 files changed, 75 insertions(+) create mode 100644 src/main/java/seedu/address/logic/commands/AddTaskCommand.java create mode 100644 src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java diff --git a/src/main/java/seedu/address/logic/commands/AddTaskCommand.java b/src/main/java/seedu/address/logic/commands/AddTaskCommand.java new file mode 100644 index 00000000000..9950206baeb --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/AddTaskCommand.java @@ -0,0 +1,57 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; + +import seedu.address.commons.util.ToStringBuilder; +import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.model.Model; +import seedu.address.model.task.Task; + +public class AddTaskCommand extends Command { + + public static final String COMMAND_WORD = "add task"; + + private final Task toAdd; + + /** + * Creates an AddTaskCommand to add the specified {@code Task} + */ + public AddTaskCommand(Task task) { + requireNonNull(task); + toAdd = task; + } + + /** + * Executes the command and returns the result message. + * + * @param model {@code Model} which the command should operate on. + * @return feedback message of the operation result for display + * @throws CommandException If an error occurs during command execution. + */ + @Override + public CommandResult execute(Model model) throws CommandException { + return null; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof AddCommand)) { + return false; + } + + AddTaskCommand otherAddTaskCommand = (AddTaskCommand) other; + return toAdd.equals(otherAddTaskCommand.toAdd); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .add("toAdd", toAdd) + .toString(); + } +} diff --git a/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java new file mode 100644 index 00000000000..c0a15f17b00 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java @@ -0,0 +1,18 @@ +package seedu.address.logic.parser; + +import seedu.address.logic.commands.AddTaskCommand; +import seedu.address.logic.parser.exceptions.ParseException; + +public class AddTaskCommandParser implements Parser { + + /** + * Parses {@code userInput} into a command and returns it. + * + * @param userInput + * @throws ParseException if {@code userInput} does not conform the expected format + */ + @Override + public AddTaskCommand parse(String userInput) throws ParseException { + return null; + } +} From 1a40f52e4ca2067f931c1938aed36f9eba1eedab Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Wed, 13 Mar 2024 05:45:15 +0800 Subject: [PATCH 03/13] Create TaskList class Create the TaskList class to store the tasks from users. --- .../java/seedu/address/model/TaskList.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/seedu/address/model/TaskList.java diff --git a/src/main/java/seedu/address/model/TaskList.java b/src/main/java/seedu/address/model/TaskList.java new file mode 100644 index 00000000000..64ed7121cb0 --- /dev/null +++ b/src/main/java/seedu/address/model/TaskList.java @@ -0,0 +1,29 @@ +package seedu.address.model; + +import java.util.ArrayList; + +import seedu.address.model.task.Task; + +/** + * A class that stores the tasks from users. + */ +public class TaskList { + private static ArrayList tasks; + + /** + * Constructor of the class. + */ + public TaskList() { + tasks = new ArrayList<>(); + } + + /** + * Adds a task to the end of list. + * @param task The task to be added to the list. + */ + public static void addTask(Task task) { + tasks.add(task); + } + +} + From 7dc4a279406ace15860ee51a0bdaba4e02a6e705 Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Wed, 13 Mar 2024 06:49:40 +0800 Subject: [PATCH 04/13] Update add task logic Update AddressBookParser.parseCommand() to recognize the addtask keyword. Modify AddTaskCommandParser.java to parse user input. Modify AddTaskCommand.java to add task to the task list. Update TaskList.java to include methods to add class and to check duplicate tasks. Update ModelManager.java and MainApp.java to include TaskList in the constructor. Update Messages.java to include the method for formatting task description. --- src/main/java/seedu/address/MainApp.java | 4 +++- .../java/seedu/address/logic/Messages.java | 8 +++++++ .../logic/commands/AddTaskCommand.java | 19 +++++++++++++++-- .../logic/parser/AddTaskCommandParser.java | 16 +++++++++++++- .../logic/parser/AddressBookParser.java | 4 ++++ src/main/java/seedu/address/model/Model.java | 5 +++++ .../seedu/address/model/ModelManager.java | 21 ++++++++++++++++--- .../java/seedu/address/model/TaskList.java | 13 +++++++----- 8 files changed, 78 insertions(+), 12 deletions(-) diff --git a/src/main/java/seedu/address/MainApp.java b/src/main/java/seedu/address/MainApp.java index 3d6bd06d5af..9ad27b6b1e0 100644 --- a/src/main/java/seedu/address/MainApp.java +++ b/src/main/java/seedu/address/MainApp.java @@ -20,6 +20,7 @@ import seedu.address.model.ModelManager; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.ReadOnlyUserPrefs; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; import seedu.address.model.util.SampleDataUtil; import seedu.address.storage.AddressBookStorage; @@ -77,6 +78,7 @@ private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) { Optional addressBookOptional; ReadOnlyAddressBook initialData; + TaskList taskList = new TaskList(); try { addressBookOptional = storage.readAddressBook(); if (!addressBookOptional.isPresent()) { @@ -90,7 +92,7 @@ private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) { initialData = new AddressBook(); } - return new ModelManager(initialData, userPrefs); + return new ModelManager(initialData, taskList, userPrefs); } private void initLogging(Config config) { diff --git a/src/main/java/seedu/address/logic/Messages.java b/src/main/java/seedu/address/logic/Messages.java index ecd32c31b53..4f44632ac51 100644 --- a/src/main/java/seedu/address/logic/Messages.java +++ b/src/main/java/seedu/address/logic/Messages.java @@ -6,6 +6,7 @@ import seedu.address.logic.parser.Prefix; import seedu.address.model.person.Person; +import seedu.address.model.task.Task; /** * Container for user visible messages. @@ -48,4 +49,11 @@ public static String format(Person person) { return builder.toString(); } + /** + * Formats the {@code task} for display to the user. + */ + public static String formatTask(Task task) { + return task.getDescription(); + } + } diff --git a/src/main/java/seedu/address/logic/commands/AddTaskCommand.java b/src/main/java/seedu/address/logic/commands/AddTaskCommand.java index 9950206baeb..7eca19cd439 100644 --- a/src/main/java/seedu/address/logic/commands/AddTaskCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddTaskCommand.java @@ -3,13 +3,21 @@ import static java.util.Objects.requireNonNull; import seedu.address.commons.util.ToStringBuilder; +import seedu.address.logic.Messages; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; import seedu.address.model.task.Task; +/** + * Adds a task to the task list. + */ public class AddTaskCommand extends Command { - public static final String COMMAND_WORD = "add task"; + public static final String COMMAND_WORD = "addtask"; + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task to the task list. " + + "Parameter: the description of the task."; + public static final String MESSAGE_SUCCESS = "New task added: %1$s"; + public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the task list."; private final Task toAdd; @@ -30,7 +38,14 @@ public AddTaskCommand(Task task) { */ @Override public CommandResult execute(Model model) throws CommandException { - return null; + requireNonNull(model); + + if (model.hasTask(toAdd)) { + throw new CommandException(MESSAGE_DUPLICATE_TASK); + } + + model.addTask(toAdd); + return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.formatTask(toAdd))); } @Override diff --git a/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java index c0a15f17b00..5d2efe7ee0c 100644 --- a/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java @@ -1,8 +1,14 @@ package seedu.address.logic.parser; +import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; + import seedu.address.logic.commands.AddTaskCommand; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.task.Task; +/** + * Parses input arguments and creates a new AddTaskCommand object + */ public class AddTaskCommandParser implements Parser { /** @@ -13,6 +19,14 @@ public class AddTaskCommandParser implements Parser { */ @Override public AddTaskCommand parse(String userInput) throws ParseException { - return null; + String description = userInput; + + if (description.isEmpty()) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddTaskCommand.MESSAGE_USAGE)); + } + + Task task = new Task(description); + return new AddTaskCommand(task); } + } diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index 3149ee07e0b..5bb672aac79 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -9,6 +9,7 @@ import seedu.address.commons.core.LogsCenter; import seedu.address.logic.commands.AddCommand; +import seedu.address.logic.commands.AddTaskCommand; import seedu.address.logic.commands.ClearCommand; import seedu.address.logic.commands.Command; import seedu.address.logic.commands.DeleteCommand; @@ -56,6 +57,9 @@ public Command parseCommand(String userInput) throws ParseException { case AddCommand.COMMAND_WORD: return new AddCommandParser().parse(arguments); + case AddTaskCommand.COMMAND_WORD: + return new AddTaskCommandParser().parse(arguments); + case EditCommand.COMMAND_WORD: return new EditCommandParser().parse(arguments); diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index d54df471c1f..024a99a313c 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -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.Task; /** * The API of the Model component. @@ -76,6 +77,10 @@ public interface Model { */ void setPerson(Person target, Person editedPerson); + void addTask(Task task); + + boolean hasTask(Task task); + /** Returns an unmodifiable view of the filtered person list */ ObservableList getFilteredPersonList(); diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index 57bc563fde6..38951ece9bd 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -12,32 +12,34 @@ import seedu.address.commons.core.GuiSettings; import seedu.address.commons.core.LogsCenter; import seedu.address.model.person.Person; +import seedu.address.model.task.Task; /** * Represents the in-memory model of the address book data. */ public class ModelManager implements Model { private static final Logger logger = LogsCenter.getLogger(ModelManager.class); - private final AddressBook addressBook; + private final TaskList taskList; private final UserPrefs userPrefs; private final FilteredList filteredPersons; /** * Initializes a ModelManager with the given addressBook and userPrefs. */ - public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) { + public ModelManager(ReadOnlyAddressBook addressBook, TaskList taskList, ReadOnlyUserPrefs userPrefs) { requireAllNonNull(addressBook, userPrefs); logger.fine("Initializing with address book: " + addressBook + " and user prefs " + userPrefs); this.addressBook = new AddressBook(addressBook); + this.taskList = taskList; this.userPrefs = new UserPrefs(userPrefs); filteredPersons = new FilteredList<>(this.addressBook.getPersonList()); } public ModelManager() { - this(new AddressBook(), new UserPrefs()); + this(new AddressBook(), new TaskList(), new UserPrefs()); } //=========== UserPrefs ================================================================================== @@ -111,6 +113,19 @@ public void setPerson(Person target, Person editedPerson) { addressBook.setPerson(target, editedPerson); } + //=========== Task Manager =============================================================================== + + @Override + public void addTask(Task task) { + taskList.addTask(task); + } + + @Override + public boolean hasTask(Task task) { + requireNonNull(task); + return taskList.hasTask(task); + } + //=========== Filtered Person List Accessors ============================================================= /** diff --git a/src/main/java/seedu/address/model/TaskList.java b/src/main/java/seedu/address/model/TaskList.java index 64ed7121cb0..a2519da88fe 100644 --- a/src/main/java/seedu/address/model/TaskList.java +++ b/src/main/java/seedu/address/model/TaskList.java @@ -8,22 +8,25 @@ * A class that stores the tasks from users. */ public class TaskList { - private static ArrayList tasks; + private ArrayList taskList; /** * Constructor of the class. */ public TaskList() { - tasks = new ArrayList<>(); + taskList = new ArrayList<>(); } /** * Adds a task to the end of list. * @param task The task to be added to the list. */ - public static void addTask(Task task) { - tasks.add(task); + public void addTask(Task task) { + taskList.add(task); + } + + public boolean hasTask(Task task) { + return taskList.contains(task); } - } From 78eade941749fa7d34b6cfeaf090b4495c1541c2 Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Wed, 13 Mar 2024 15:18:44 +0800 Subject: [PATCH 05/13] Create TaskList Storage classes Create TaskList Storage to store tasks into the data file. Create Json adapted classes to store tasks in a Json file. --- .../address/storage/JsonAdaptedTask.java | 45 +++++++++++ .../storage/JsonSerializableTaskList.java | 60 ++++++++++++++ .../address/storage/JsonTaskListStorage.java | 80 +++++++++++++++++++ .../address/storage/TaskListStorage.java | 44 ++++++++++ 4 files changed, 229 insertions(+) create mode 100644 src/main/java/seedu/address/storage/JsonAdaptedTask.java create mode 100644 src/main/java/seedu/address/storage/JsonSerializableTaskList.java create mode 100644 src/main/java/seedu/address/storage/JsonTaskListStorage.java create mode 100644 src/main/java/seedu/address/storage/TaskListStorage.java diff --git a/src/main/java/seedu/address/storage/JsonAdaptedTask.java b/src/main/java/seedu/address/storage/JsonAdaptedTask.java new file mode 100644 index 00000000000..72b0bf5eb53 --- /dev/null +++ b/src/main/java/seedu/address/storage/JsonAdaptedTask.java @@ -0,0 +1,45 @@ +package seedu.address.storage; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.task.Task; + +/** + * Jackson-friendly version of {@link Task}. + */ +public class JsonAdaptedTask { + + public static final String MISSING_DESCRIPTION_MESSAGE = "No description found!"; + + private final String description; + + /** + * Constructs a {@code JsonAdaptedPerson} with the given person details. + */ + @JsonCreator + public JsonAdaptedTask(@JsonProperty("description") String description) { + this.description = description; + } + + /** + * Converts a given {@code Task} into this class for Jackson use. + */ + public JsonAdaptedTask(Task source) { + description = source.getDescription(); + } + + /** + * Converts this Jackson-friendly adapted task object into the model's {@code Task} object. + * + * @throws IllegalValueException if there were any data constraints violated in the adapted person. + */ + public Task toModelType() throws IllegalValueException { + if (description.isEmpty()) { + throw new IllegalValueException(MISSING_DESCRIPTION_MESSAGE); + } + + return new Task(description); + } +} diff --git a/src/main/java/seedu/address/storage/JsonSerializableTaskList.java b/src/main/java/seedu/address/storage/JsonSerializableTaskList.java new file mode 100644 index 00000000000..85f3f997087 --- /dev/null +++ b/src/main/java/seedu/address/storage/JsonSerializableTaskList.java @@ -0,0 +1,60 @@ +package seedu.address.storage; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.TaskList; +import seedu.address.model.task.Task; + +/** + * An Immutable TaskList that is serializable to JSON format. + */ +@JsonRootName(value = "TaskList") +class JsonSerializableTaskList { + + public static final String MESSAGE_DUPLICATE_TASK = "Task list contains duplicate task(s)."; + + private final List tasks = new ArrayList<>(); + + /** + * Constructs a {@code JsonSerializableTaskList} with the given persons. + */ + @JsonCreator + public JsonSerializableTaskList(@JsonProperty("description") List tasks) { + this.tasks.addAll(tasks); + } + + /** + * Converts a given {@code TaskList} into this class for Jackson use. + * + * @param source future changes to this will not affect the created + * {@code JsonSerializableTaskList}. + */ + public JsonSerializableTaskList(TaskList source) { + tasks.addAll(source.getSerializeTaskList().stream().map(JsonAdaptedTask::new).collect(Collectors.toList())); + } + + /** + * Converts this address book into the model's {@code TaskList} object. + * + * @throws IllegalValueException if there were any data constraints violated. + */ + public TaskList toModelType() throws IllegalValueException { + TaskList TaskList = new TaskList(); + for (JsonAdaptedTask jsonAdaptedTask : tasks) { + Task task = jsonAdaptedTask.toModelType(); + if (TaskList.hasTask(task)) { + throw new IllegalValueException(MESSAGE_DUPLICATE_TASK); + } + TaskList.addTask(task); + } + return TaskList; + } + +} diff --git a/src/main/java/seedu/address/storage/JsonTaskListStorage.java b/src/main/java/seedu/address/storage/JsonTaskListStorage.java new file mode 100644 index 00000000000..ac4e517fcd6 --- /dev/null +++ b/src/main/java/seedu/address/storage/JsonTaskListStorage.java @@ -0,0 +1,80 @@ +package seedu.address.storage; + +import static java.util.Objects.requireNonNull; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Optional; +import java.util.logging.Logger; + +import seedu.address.commons.core.LogsCenter; +import seedu.address.commons.exceptions.DataLoadingException; +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.commons.util.FileUtil; +import seedu.address.commons.util.JsonUtil; +import seedu.address.model.TaskList; + +/** + * A class to access TaskList data stored as a json file on the hard disk. + */ +public class JsonTaskListStorage implements TaskListStorage { + + private static final Logger logger = LogsCenter.getLogger(JsonTaskListStorage.class); + + private Path filePath; + + public JsonTaskListStorage(Path filePath) { + this.filePath = filePath; + } + + public Path getTaskListFilePath() { + return filePath; + } + + @Override + public Optional readTaskList() throws DataLoadingException { + return readTaskList(filePath); + } + + /** + * Similar to {@link #readTaskList()}. + * + * @param filePath location of the data. Cannot be null. + * @throws DataLoadingException if loading the data from storage failed. + */ + public Optional readTaskList(Path filePath) throws DataLoadingException { + requireNonNull(filePath); + + Optional jsonTaskList = JsonUtil.readJsonFile( + filePath, JsonSerializableTaskList.class); + if (!jsonTaskList.isPresent()) { + return Optional.empty(); + } + + try { + return Optional.of(jsonTaskList.get().toModelType()); + } catch (IllegalValueException ive) { + logger.info("Illegal values found in " + filePath + ": " + ive.getMessage()); + throw new DataLoadingException(ive); + } + } + + @Override + public void saveTaskList(TaskList TaskList) throws IOException { + saveTaskList(TaskList, filePath); + } + + /** + * Similar to {@link #saveTaskList(TaskList)}. + * + * @param filePath location of the data. Cannot be null. + */ + public void saveTaskList(TaskList TaskList, Path filePath) throws IOException { + requireNonNull(TaskList); + requireNonNull(filePath); + + FileUtil.createIfMissing(filePath); + JsonUtil.saveJsonFile(new JsonSerializableTaskList(TaskList), filePath); + } + +} diff --git a/src/main/java/seedu/address/storage/TaskListStorage.java b/src/main/java/seedu/address/storage/TaskListStorage.java new file mode 100644 index 00000000000..f053fb42306 --- /dev/null +++ b/src/main/java/seedu/address/storage/TaskListStorage.java @@ -0,0 +1,44 @@ +package seedu.address.storage; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Optional; + +import seedu.address.commons.exceptions.DataLoadingException; +import seedu.address.model.TaskList; + +/** + * Represents a storage for {@link seedu.address.model.TaskList}. + */ +public interface TaskListStorage { + + /** + * Returns the file path of the data file. + */ + Path getTaskListFilePath(); + + /** + * Returns TaskList data. + * Returns {@code Optional.empty()} if storage file is not found. + * + * @throws DataLoadingException if loading the data from storage failed. + */ + Optional readTaskList() throws DataLoadingException; + + /** + * @see #getTaskListFilePath() + */ + Optional readTaskList(Path filePath) throws DataLoadingException; + + /** + * Saves the given {@link TaskList} to the storage. + * @param taskList cannot be null. + * @throws IOException if there was any problem writing to the file. + */ + void saveTaskList(TaskList taskList) throws IOException; + + /** + * @see #saveTaskList(TaskList) + */ + void saveTaskList(TaskList taskList, Path filePath) throws IOException; +} From 449814cfb2a5e78afeacea5e38bc9dfb235a2af8 Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Wed, 13 Mar 2024 17:37:44 +0800 Subject: [PATCH 06/13] Update Storage Let's update the Storage package to store the task list in the json data file. Let's update the model package to contain the task list. Let's update the logic package to save the tasks to the task list. --- src/main/java/seedu/address/MainApp.java | 25 ++++++-- .../seedu/address/logic/LogicManager.java | 1 + src/main/java/seedu/address/model/Model.java | 27 +++++++++ .../seedu/address/model/ModelManager.java | 41 ++++++++++++- .../address/model/ReadOnlyUserPrefs.java | 2 + .../java/seedu/address/model/TaskList.java | 14 ++++- .../java/seedu/address/model/UserPrefs.java | 19 ++++++- .../address/model/util/SampleDataUtil.java | 8 +++ .../storage/JsonSerializableTaskList.java | 12 ++-- .../address/storage/JsonTaskListStorage.java | 10 ++-- .../java/seedu/address/storage/Storage.java | 12 +++- .../seedu/address/storage/StorageManager.java | 57 ++++++++++++++++++- .../seedu/address/logic/LogicManagerTest.java | 4 +- .../commands/AddCommandIntegrationTest.java | 5 +- .../address/storage/StorageManagerTest.java | 2 +- 15 files changed, 211 insertions(+), 28 deletions(-) diff --git a/src/main/java/seedu/address/MainApp.java b/src/main/java/seedu/address/MainApp.java index 9ad27b6b1e0..21b52ab6a4f 100644 --- a/src/main/java/seedu/address/MainApp.java +++ b/src/main/java/seedu/address/MainApp.java @@ -25,9 +25,11 @@ import seedu.address.model.util.SampleDataUtil; import seedu.address.storage.AddressBookStorage; import seedu.address.storage.JsonAddressBookStorage; +import seedu.address.storage.JsonTaskListStorage; import seedu.address.storage.JsonUserPrefsStorage; import seedu.address.storage.Storage; import seedu.address.storage.StorageManager; +import seedu.address.storage.TaskListStorage; import seedu.address.storage.UserPrefsStorage; import seedu.address.ui.Ui; import seedu.address.ui.UiManager; @@ -59,7 +61,8 @@ public void init() throws Exception { UserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(config.getUserPrefsFilePath()); UserPrefs userPrefs = initPrefs(userPrefsStorage); AddressBookStorage addressBookStorage = new JsonAddressBookStorage(userPrefs.getAddressBookFilePath()); - storage = new StorageManager(addressBookStorage, userPrefsStorage); + TaskListStorage taskListStorage = new JsonTaskListStorage(userPrefs.getTaskListFilePath()); + storage = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); model = initModelManager(storage, userPrefs); @@ -74,11 +77,13 @@ public void init() throws Exception { * or an empty address book will be used instead if errors occur when reading {@code storage}'s address book. */ private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) { - logger.info("Using data file : " + storage.getAddressBookFilePath()); + logger.info("Using data file : " + storage.getAddressBookFilePath() + ", " + + storage.getTaskListFilePath()); Optional addressBookOptional; ReadOnlyAddressBook initialData; - TaskList taskList = new TaskList(); + Optional taskListOptional; + TaskList initialTasks; try { addressBookOptional = storage.readAddressBook(); if (!addressBookOptional.isPresent()) { @@ -92,7 +97,19 @@ private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) { initialData = new AddressBook(); } - return new ModelManager(initialData, taskList, userPrefs); + try { + taskListOptional = storage.readTaskList(); + if (!taskListOptional.isPresent()) { + logger.info("Creating a new data file " + storage.getTaskListFilePath()); + } + initialTasks = taskListOptional.orElseGet(SampleDataUtil::getSampleTaskList); + } catch (DataLoadingException e) { + logger.warning("Data file at " + storage.getTaskListFilePath() + " could not be loaded." + + " Will be starting with an empty task list."); + initialTasks = new TaskList(); + } + + return new ModelManager(initialData, initialTasks, userPrefs); } private void initLogging(Config config) { diff --git a/src/main/java/seedu/address/logic/LogicManager.java b/src/main/java/seedu/address/logic/LogicManager.java index 5aa3b91c7d0..b60400449bf 100644 --- a/src/main/java/seedu/address/logic/LogicManager.java +++ b/src/main/java/seedu/address/logic/LogicManager.java @@ -52,6 +52,7 @@ public CommandResult execute(String commandText) throws CommandException, ParseE try { storage.saveAddressBook(model.getAddressBook()); + storage.saveTaskList(model.getTaskList()); } catch (AccessDeniedException e) { throw new CommandException(String.format(FILE_OPS_PERMISSION_ERROR_FORMAT, e.getMessage()), e); } catch (IOException ioe) { diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index 024a99a313c..5bc2d35e4de 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -77,8 +77,35 @@ public interface Model { */ void setPerson(Person target, Person editedPerson); + /** + * Returns the user prefs' task list file path. + */ + Path getTaskListFilePath(); + + /** + * Sets the user prefs' task list file path. + */ + void setTaskListFilePath(Path addressBookFilePath); + + /** + * Replaces task list data with the data in {@code taskList}. + */ + static void setTaskList(TaskList taskList) {} + + /** + * Returns the task list. + */ + TaskList getTaskList(); + + /** + * Adds the given task. + * {@code task} must not already exist in the address book. + */ void addTask(Task task); + /** + * Returns true if a task has the same description as a {@code task} in the task list. + */ boolean hasTask(Task task); /** Returns an unmodifiable view of the filtered person list */ diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index 38951ece9bd..24e6ff2a8d6 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -28,9 +28,10 @@ public class ModelManager implements Model { * Initializes a ModelManager with the given addressBook and userPrefs. */ public ModelManager(ReadOnlyAddressBook addressBook, TaskList taskList, ReadOnlyUserPrefs userPrefs) { - requireAllNonNull(addressBook, userPrefs); + requireAllNonNull(addressBook, taskList, userPrefs); - logger.fine("Initializing with address book: " + addressBook + " and user prefs " + userPrefs); + logger.fine("Initializing with address book: " + addressBook + ", task list: " + taskList + + " and user prefs " + userPrefs); this.addressBook = new AddressBook(addressBook); this.taskList = taskList; @@ -71,12 +72,31 @@ public Path getAddressBookFilePath() { return userPrefs.getAddressBookFilePath(); } + /** + * Returns the user prefs' task list file path. + */ + @Override + public Path getTaskListFilePath() { + return userPrefs.getTaskListFilePath(); + } + @Override public void setAddressBookFilePath(Path addressBookFilePath) { requireNonNull(addressBookFilePath); userPrefs.setAddressBookFilePath(addressBookFilePath); } + /** + * Sets the user prefs' task list file path. + * + * @param taskListFilePath + */ + @Override + public void setTaskListFilePath(Path taskListFilePath) { + requireNonNull(taskListFilePath); + userPrefs.setTaskListFilePath(taskListFilePath); + } + //=========== AddressBook ================================================================================ @Override @@ -126,6 +146,23 @@ public boolean hasTask(Task task) { return taskList.hasTask(task); } + /** + * Replaces task list data with the data in {@code taskList}. + * + * @param tasks + */ + public void setTaskList(TaskList tasks) { + taskList.setTaskList(tasks); + } + + /** + * Returns the task list. + */ + @Override + public TaskList getTaskList() { + return taskList; + } + //=========== Filtered Person List Accessors ============================================================= /** diff --git a/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java b/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java index befd58a4c73..b983acde4c0 100644 --- a/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java +++ b/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java @@ -13,4 +13,6 @@ public interface ReadOnlyUserPrefs { Path getAddressBookFilePath(); + Path getTaskListFilePath(); + } diff --git a/src/main/java/seedu/address/model/TaskList.java b/src/main/java/seedu/address/model/TaskList.java index a2519da88fe..ffd12ac5d4a 100644 --- a/src/main/java/seedu/address/model/TaskList.java +++ b/src/main/java/seedu/address/model/TaskList.java @@ -1,7 +1,10 @@ package seedu.address.model; import java.util.ArrayList; +import java.util.Collection; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import seedu.address.model.task.Task; /** @@ -17,16 +20,25 @@ public TaskList() { taskList = new ArrayList<>(); } + @SuppressWarnings("unchecked") + public void setTaskList(TaskList tasks) { + taskList.addAll((Collection) tasks); + } + /** * Adds a task to the end of list. + * * @param task The task to be added to the list. */ public void addTask(Task task) { taskList.add(task); } + public ObservableList getSerializeTaskList() { + return FXCollections.unmodifiableObservableList(FXCollections.observableArrayList(taskList)); + } + public boolean hasTask(Task task) { return taskList.contains(task); } } - diff --git a/src/main/java/seedu/address/model/UserPrefs.java b/src/main/java/seedu/address/model/UserPrefs.java index 6be655fb4c7..5c2503f0cd2 100644 --- a/src/main/java/seedu/address/model/UserPrefs.java +++ b/src/main/java/seedu/address/model/UserPrefs.java @@ -16,6 +16,8 @@ public class UserPrefs implements ReadOnlyUserPrefs { private GuiSettings guiSettings = new GuiSettings(); private Path addressBookFilePath = Paths.get("data" , "addressbook.json"); + private Path taskListFilePath = Paths.get("data", "tasklist.json"); + /** * Creates a {@code UserPrefs} with default values. */ @@ -36,6 +38,7 @@ public void resetData(ReadOnlyUserPrefs newUserPrefs) { requireNonNull(newUserPrefs); setGuiSettings(newUserPrefs.getGuiSettings()); setAddressBookFilePath(newUserPrefs.getAddressBookFilePath()); + setTaskListFilePath(newUserPrefs.getTaskListFilePath()); } public GuiSettings getGuiSettings() { @@ -50,12 +53,20 @@ public void setGuiSettings(GuiSettings guiSettings) { public Path getAddressBookFilePath() { return addressBookFilePath; } + public Path getTaskListFilePath() { + return taskListFilePath; + } public void setAddressBookFilePath(Path addressBookFilePath) { requireNonNull(addressBookFilePath); this.addressBookFilePath = addressBookFilePath; } + public void setTaskListFilePath(Path taskListFilePath) { + requireNonNull(taskListFilePath); + this.taskListFilePath = taskListFilePath; + } + @Override public boolean equals(Object other) { if (other == this) { @@ -69,19 +80,21 @@ public boolean equals(Object other) { UserPrefs otherUserPrefs = (UserPrefs) other; return guiSettings.equals(otherUserPrefs.guiSettings) - && addressBookFilePath.equals(otherUserPrefs.addressBookFilePath); + && addressBookFilePath.equals(otherUserPrefs.addressBookFilePath) + && taskListFilePath.equals(otherUserPrefs.taskListFilePath); } @Override public int hashCode() { - return Objects.hash(guiSettings, addressBookFilePath); + return Objects.hash(guiSettings, addressBookFilePath, taskListFilePath); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Gui Settings : " + guiSettings); - sb.append("\nLocal data file location : " + addressBookFilePath); + sb.append("\nLocal address book file location : " + addressBookFilePath); + sb.append("\nLocal task list file location : " + taskListFilePath); return sb.toString(); } diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 1806da4facf..6c7584c8810 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -6,12 +6,14 @@ import seedu.address.model.AddressBook; import seedu.address.model.ReadOnlyAddressBook; +import seedu.address.model.TaskList; import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; import seedu.address.model.tag.Tag; +import seedu.address.model.task.Task; /** * Contains utility methods for populating {@code AddressBook} with sample data. @@ -40,6 +42,12 @@ public static Person[] getSamplePersons() { }; } + public static TaskList getSampleTaskList() { + TaskList tasks = new TaskList(); + tasks.addTask(new Task("CS2103T ip")); + return tasks; + } + public static ReadOnlyAddressBook getSampleAddressBook() { AddressBook sampleAb = new AddressBook(); for (Person samplePerson : getSamplePersons()) { diff --git a/src/main/java/seedu/address/storage/JsonSerializableTaskList.java b/src/main/java/seedu/address/storage/JsonSerializableTaskList.java index 85f3f997087..a77fa80233f 100644 --- a/src/main/java/seedu/address/storage/JsonSerializableTaskList.java +++ b/src/main/java/seedu/address/storage/JsonSerializableTaskList.java @@ -15,7 +15,7 @@ /** * An Immutable TaskList that is serializable to JSON format. */ -@JsonRootName(value = "TaskList") +@JsonRootName(value = "tasklist") class JsonSerializableTaskList { public static final String MESSAGE_DUPLICATE_TASK = "Task list contains duplicate task(s)."; @@ -26,7 +26,7 @@ class JsonSerializableTaskList { * Constructs a {@code JsonSerializableTaskList} with the given persons. */ @JsonCreator - public JsonSerializableTaskList(@JsonProperty("description") List tasks) { + public JsonSerializableTaskList(@JsonProperty("tasks") List tasks) { this.tasks.addAll(tasks); } @@ -46,15 +46,15 @@ public JsonSerializableTaskList(TaskList source) { * @throws IllegalValueException if there were any data constraints violated. */ public TaskList toModelType() throws IllegalValueException { - TaskList TaskList = new TaskList(); + TaskList taskList = new TaskList(); for (JsonAdaptedTask jsonAdaptedTask : tasks) { Task task = jsonAdaptedTask.toModelType(); - if (TaskList.hasTask(task)) { + if (taskList.hasTask(task)) { throw new IllegalValueException(MESSAGE_DUPLICATE_TASK); } - TaskList.addTask(task); + taskList.addTask(task); } - return TaskList; + return taskList; } } diff --git a/src/main/java/seedu/address/storage/JsonTaskListStorage.java b/src/main/java/seedu/address/storage/JsonTaskListStorage.java index ac4e517fcd6..fa39dcc64c2 100644 --- a/src/main/java/seedu/address/storage/JsonTaskListStorage.java +++ b/src/main/java/seedu/address/storage/JsonTaskListStorage.java @@ -60,8 +60,8 @@ public Optional readTaskList(Path filePath) throws DataLoadingExceptio } @Override - public void saveTaskList(TaskList TaskList) throws IOException { - saveTaskList(TaskList, filePath); + public void saveTaskList(TaskList taskList) throws IOException { + saveTaskList(taskList, filePath); } /** @@ -69,12 +69,12 @@ public void saveTaskList(TaskList TaskList) throws IOException { * * @param filePath location of the data. Cannot be null. */ - public void saveTaskList(TaskList TaskList, Path filePath) throws IOException { - requireNonNull(TaskList); + public void saveTaskList(TaskList taskList, Path filePath) throws IOException { + requireNonNull(taskList); requireNonNull(filePath); FileUtil.createIfMissing(filePath); - JsonUtil.saveJsonFile(new JsonSerializableTaskList(TaskList), filePath); + JsonUtil.saveJsonFile(new JsonSerializableTaskList(taskList), filePath); } } diff --git a/src/main/java/seedu/address/storage/Storage.java b/src/main/java/seedu/address/storage/Storage.java index 9fba0c7a1d6..52087ab7e77 100644 --- a/src/main/java/seedu/address/storage/Storage.java +++ b/src/main/java/seedu/address/storage/Storage.java @@ -7,12 +7,13 @@ import seedu.address.commons.exceptions.DataLoadingException; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.ReadOnlyUserPrefs; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; /** * API of the Storage component */ -public interface Storage extends AddressBookStorage, UserPrefsStorage { +public interface Storage extends AddressBookStorage, TaskListStorage, UserPrefsStorage { @Override Optional readUserPrefs() throws DataLoadingException; @@ -29,4 +30,13 @@ public interface Storage extends AddressBookStorage, UserPrefsStorage { @Override void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException; + @Override + Path getTaskListFilePath(); + + @Override + Optional readTaskList() throws DataLoadingException; + + @Override + void saveTaskList(TaskList taskList) throws IOException; + } diff --git a/src/main/java/seedu/address/storage/StorageManager.java b/src/main/java/seedu/address/storage/StorageManager.java index 8b84a9024d5..d1efe5a70b8 100644 --- a/src/main/java/seedu/address/storage/StorageManager.java +++ b/src/main/java/seedu/address/storage/StorageManager.java @@ -9,6 +9,7 @@ import seedu.address.commons.exceptions.DataLoadingException; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.ReadOnlyUserPrefs; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; /** @@ -18,13 +19,16 @@ public class StorageManager implements Storage { private static final Logger logger = LogsCenter.getLogger(StorageManager.class); private AddressBookStorage addressBookStorage; + private TaskListStorage taskListStorage; private UserPrefsStorage userPrefsStorage; /** * Creates a {@code StorageManager} with the given {@code AddressBookStorage} and {@code UserPrefStorage}. */ - public StorageManager(AddressBookStorage addressBookStorage, UserPrefsStorage userPrefsStorage) { + public StorageManager(AddressBookStorage addressBookStorage, TaskListStorage taskListStorage, + UserPrefsStorage userPrefsStorage) { this.addressBookStorage = addressBookStorage; + this.taskListStorage = taskListStorage; this.userPrefsStorage = userPrefsStorage; } @@ -75,4 +79,55 @@ public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) thro addressBookStorage.saveAddressBook(addressBook, filePath); } + + // ================ TaskList methods ============================== + + /** + * Returns the file path of the data file. + */ + @Override + public Path getTaskListFilePath() { + return taskListStorage.getTaskListFilePath(); + } + + /** + * Returns TaskList data. + * Returns {@code Optional.empty()} if storage file is not found. + * + * @throws DataLoadingException if loading the data from storage failed. + */ + @Override + public Optional readTaskList() throws DataLoadingException { + return readTaskList(taskListStorage.getTaskListFilePath()); + } + + /** + * @param filePath cannot be null. + * @see #getTaskListFilePath() + */ + @Override + public Optional readTaskList(Path filePath) throws DataLoadingException { + logger.fine("Attempting to read data from file: " + filePath); + return taskListStorage.readTaskList(filePath); + } + + /** + * Saves the given {@link TaskList} to the storage. + * + * @param taskList cannot be null. + * @throws IOException if there was any problem writing to the file. + */ + @Override + public void saveTaskList(TaskList taskList) throws IOException { + saveTaskList(taskList, taskListStorage.getTaskListFilePath()); + } + + /** + * @see #saveTaskList(TaskList) + */ + public void saveTaskList(TaskList taskList, Path filePath) throws IOException { + logger.fine("Attempting to write to data file: " + filePath); + taskListStorage.saveTaskList(taskList, filePath); + } + } diff --git a/src/test/java/seedu/address/logic/LogicManagerTest.java b/src/test/java/seedu/address/logic/LogicManagerTest.java index baf8ce336a2..b0b81a8b427 100644 --- a/src/test/java/seedu/address/logic/LogicManagerTest.java +++ b/src/test/java/seedu/address/logic/LogicManagerTest.java @@ -48,7 +48,7 @@ public void setUp() { JsonAddressBookStorage addressBookStorage = new JsonAddressBookStorage(temporaryFolder.resolve("addressBook.json")); JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(temporaryFolder.resolve("userPrefs.json")); - StorageManager storage = new StorageManager(addressBookStorage, userPrefsStorage); + StorageManager storage = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); logic = new LogicManager(model, storage); } @@ -160,7 +160,7 @@ public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(temporaryFolder.resolve("ExceptionUserPrefs.json")); - StorageManager storage = new StorageManager(addressBookStorage, userPrefsStorage); + StorageManager storage = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); logic = new LogicManager(model, storage); diff --git a/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java b/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java index 162a0c86031..5758f5d7062 100644 --- a/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java +++ b/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java @@ -10,6 +10,7 @@ import seedu.address.logic.Messages; import seedu.address.model.Model; import seedu.address.model.ModelManager; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; import seedu.address.model.person.Person; import seedu.address.testutil.PersonBuilder; @@ -23,14 +24,14 @@ public class AddCommandIntegrationTest { @BeforeEach public void setUp() { - model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + model = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); } @Test public void execute_newPerson_success() { Person validPerson = new PersonBuilder().build(); - Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + Model expectedModel = new ModelManager(model.getAddressBook(), new TaskList(), new UserPrefs()); expectedModel.addPerson(validPerson); assertCommandSuccess(new AddCommand(validPerson), model, diff --git a/src/test/java/seedu/address/storage/StorageManagerTest.java b/src/test/java/seedu/address/storage/StorageManagerTest.java index 99a16548970..b8fc4682309 100644 --- a/src/test/java/seedu/address/storage/StorageManagerTest.java +++ b/src/test/java/seedu/address/storage/StorageManagerTest.java @@ -26,7 +26,7 @@ public class StorageManagerTest { public void setUp() { JsonAddressBookStorage addressBookStorage = new JsonAddressBookStorage(getTempFilePath("ab")); JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(getTempFilePath("prefs")); - storageManager = new StorageManager(addressBookStorage, userPrefsStorage); + storageManager = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); } private Path getTempFilePath(String fileName) { From 20ebd4286fc01a8c2587a2eef2a50a0a3938fec0 Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Wed, 13 Mar 2024 18:40:09 +0800 Subject: [PATCH 07/13] Update test files Change the test files to include the task list in model and storage classes. --- .../seedu/address/logic/LogicManagerTest.java | 15 +++++- .../logic/commands/AddCommandTest.java | 51 ++++++++++++++++++- .../logic/commands/ClearCommandTest.java | 5 +- .../logic/commands/DeleteCommandTest.java | 7 +-- .../logic/commands/EditCommandTest.java | 24 ++++++--- .../logic/commands/FindCommandTest.java | 5 +- .../logic/commands/ListCommandTest.java | 5 +- .../seedu/address/model/ModelManagerTest.java | 11 ++-- .../address/storage/StorageManagerTest.java | 1 + 9 files changed, 100 insertions(+), 24 deletions(-) diff --git a/src/test/java/seedu/address/logic/LogicManagerTest.java b/src/test/java/seedu/address/logic/LogicManagerTest.java index b0b81a8b427..cf25f6bf700 100644 --- a/src/test/java/seedu/address/logic/LogicManagerTest.java +++ b/src/test/java/seedu/address/logic/LogicManagerTest.java @@ -26,9 +26,11 @@ import seedu.address.model.Model; import seedu.address.model.ModelManager; import seedu.address.model.ReadOnlyAddressBook; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; import seedu.address.model.person.Person; import seedu.address.storage.JsonAddressBookStorage; +import seedu.address.storage.JsonTaskListStorage; import seedu.address.storage.JsonUserPrefsStorage; import seedu.address.storage.StorageManager; import seedu.address.testutil.PersonBuilder; @@ -47,6 +49,8 @@ public class LogicManagerTest { public void setUp() { JsonAddressBookStorage addressBookStorage = new JsonAddressBookStorage(temporaryFolder.resolve("addressBook.json")); + JsonTaskListStorage taskListStorage = + new JsonTaskListStorage(temporaryFolder.resolve("tasklist.json")); JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(temporaryFolder.resolve("userPrefs.json")); StorageManager storage = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); logic = new LogicManager(model, storage); @@ -123,7 +127,7 @@ private void assertCommandException(String inputCommand, String expectedMessage) */ private void assertCommandFailure(String inputCommand, Class expectedException, String expectedMessage) { - Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + Model expectedModel = new ModelManager(model.getAddressBook(), model.getTaskList(), new UserPrefs()); assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel); } @@ -158,6 +162,15 @@ public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) } }; + // Inject LogicManager with a TaskListStorage that throws the IOException e when saving + JsonTaskListStorage taskListStorage = new JsonTaskListStorage(prefPath) { + @Override + public void saveTaskList(TaskList taskList, Path filePath) + throws IOException { + throw e; + } + }; + JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(temporaryFolder.resolve("ExceptionUserPrefs.json")); StorageManager storage = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); diff --git a/src/test/java/seedu/address/logic/commands/AddCommandTest.java b/src/test/java/seedu/address/logic/commands/AddCommandTest.java index 90e8253f48e..3c434949b11 100644 --- a/src/test/java/seedu/address/logic/commands/AddCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddCommandTest.java @@ -22,7 +22,9 @@ import seedu.address.model.Model; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.ReadOnlyUserPrefs; +import seedu.address.model.TaskList; import seedu.address.model.person.Person; +import seedu.address.model.task.Task; import seedu.address.testutil.PersonBuilder; public class AddCommandTest { @@ -85,7 +87,7 @@ public void toStringMethod() { } /** - * A default model stub that have all of the methods failing. + * A default model stub that have all methods failing. */ private class ModelStub implements Model { @Override @@ -148,6 +150,53 @@ public void setPerson(Person target, Person editedPerson) { throw new AssertionError("This method should not be called."); } + /** + * Returns the user prefs' task list file path. + */ + @Override + public Path getTaskListFilePath() { + throw new AssertionError("This method should not be called."); + } + + /** + * Sets the user prefs' task list file path. + * + * @param addressBookFilePath + */ + @Override + public void setTaskListFilePath(Path addressBookFilePath) { + throw new AssertionError("This method should not be called."); + } + + /** + * Returns the task list. + */ + @Override + public TaskList getTaskList() { + throw new AssertionError("This method should not be called."); + } + + /** + * Adds the given task. + * {@code task} must not already exist in the address book. + * + * @param task + */ + @Override + public void addTask(Task task) { + throw new AssertionError("This method should not be called."); + } + + /** + * Returns true if a task has the same description as a {@code task} in the task list. + * + * @param task + */ + @Override + public boolean hasTask(Task task) { + throw new AssertionError("This method should not be called."); + } + @Override public ObservableList getFilteredPersonList() { throw new AssertionError("This method should not be called."); diff --git a/src/test/java/seedu/address/logic/commands/ClearCommandTest.java b/src/test/java/seedu/address/logic/commands/ClearCommandTest.java index 80d9110c03a..7dbefc11802 100644 --- a/src/test/java/seedu/address/logic/commands/ClearCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ClearCommandTest.java @@ -8,6 +8,7 @@ import seedu.address.model.AddressBook; import seedu.address.model.Model; import seedu.address.model.ModelManager; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; public class ClearCommandTest { @@ -22,8 +23,8 @@ public void execute_emptyAddressBook_success() { @Test public void execute_nonEmptyAddressBook_success() { - Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); - Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + Model model = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); + Model expectedModel = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); expectedModel.setAddressBook(new AddressBook()); assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel); diff --git a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java index b6f332eabca..840bb5753f6 100644 --- a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java @@ -16,6 +16,7 @@ import seedu.address.logic.Messages; import seedu.address.model.Model; import seedu.address.model.ModelManager; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; import seedu.address.model.person.Person; @@ -25,7 +26,7 @@ */ public class DeleteCommandTest { - private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + private Model model = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); @Test public void execute_validIndexUnfilteredList_success() { @@ -35,7 +36,7 @@ public void execute_validIndexUnfilteredList_success() { String expectedMessage = String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(personToDelete)); - ModelManager expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + ModelManager expectedModel = new ModelManager(model.getAddressBook(), new TaskList(), new UserPrefs()); expectedModel.deletePerson(personToDelete); assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel); @@ -59,7 +60,7 @@ public void execute_validIndexFilteredList_success() { String expectedMessage = String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(personToDelete)); - Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + Model expectedModel = new ModelManager(model.getAddressBook(), new TaskList(), new UserPrefs()); expectedModel.deletePerson(personToDelete); showNoPerson(expectedModel); diff --git a/src/test/java/seedu/address/logic/commands/EditCommandTest.java b/src/test/java/seedu/address/logic/commands/EditCommandTest.java index 469dd97daa7..141adcdb39d 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java @@ -23,6 +23,7 @@ import seedu.address.model.AddressBook; import seedu.address.model.Model; import seedu.address.model.ModelManager; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; import seedu.address.model.person.Person; import seedu.address.testutil.EditPersonDescriptorBuilder; @@ -33,7 +34,7 @@ */ public class EditCommandTest { - private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + private Model model = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); @Test public void execute_allFieldsSpecifiedUnfilteredList_success() { @@ -43,7 +44,8 @@ public void execute_allFieldsSpecifiedUnfilteredList_success() { String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)); - Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), + new TaskList(), new UserPrefs()); expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson); assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); @@ -62,9 +64,11 @@ public void execute_someFieldsSpecifiedUnfilteredList_success() { .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).build(); EditCommand editCommand = new EditCommand(indexLastPerson, descriptor); - String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)); + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, + Messages.format(editedPerson)); - Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), + new TaskList(), new UserPrefs()); expectedModel.setPerson(lastPerson, editedPerson); assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); @@ -75,9 +79,11 @@ public void execute_noFieldSpecifiedUnfilteredList_success() { EditCommand editCommand = new EditCommand(INDEX_FIRST_PERSON, new EditPersonDescriptor()); Person editedPerson = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased()); - String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)); + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, + Messages.format(editedPerson)); - Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), + new TaskList(), new UserPrefs()); assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); } @@ -91,9 +97,11 @@ public void execute_filteredList_success() { EditCommand editCommand = new EditCommand(INDEX_FIRST_PERSON, new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build()); - String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)); + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, + Messages.format(editedPerson)); - Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), + new TaskList(), new UserPrefs()); expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson); assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); diff --git a/src/test/java/seedu/address/logic/commands/FindCommandTest.java b/src/test/java/seedu/address/logic/commands/FindCommandTest.java index b8b7dbba91a..bf1de31dcfc 100644 --- a/src/test/java/seedu/address/logic/commands/FindCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/FindCommandTest.java @@ -17,6 +17,7 @@ import seedu.address.model.Model; import seedu.address.model.ModelManager; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; import seedu.address.model.person.NameContainsKeywordsPredicate; @@ -24,8 +25,8 @@ * Contains integration tests (interaction with the Model) for {@code FindCommand}. */ public class FindCommandTest { - private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); - private Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + private Model model = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); + private Model expectedModel = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); @Test public void equals() { diff --git a/src/test/java/seedu/address/logic/commands/ListCommandTest.java b/src/test/java/seedu/address/logic/commands/ListCommandTest.java index 435ff1f7275..4b4c5dc6d27 100644 --- a/src/test/java/seedu/address/logic/commands/ListCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ListCommandTest.java @@ -10,6 +10,7 @@ import seedu.address.model.Model; import seedu.address.model.ModelManager; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; /** @@ -22,8 +23,8 @@ public class ListCommandTest { @BeforeEach public void setUp() { - model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); - expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + model = new ModelManager(getTypicalAddressBook(), new TaskList(), new UserPrefs()); + expectedModel = new ModelManager(model.getAddressBook(), new TaskList(), new UserPrefs()); } @Test diff --git a/src/test/java/seedu/address/model/ModelManagerTest.java b/src/test/java/seedu/address/model/ModelManagerTest.java index 2cf1418d116..b9a4a14eb53 100644 --- a/src/test/java/seedu/address/model/ModelManagerTest.java +++ b/src/test/java/seedu/address/model/ModelManagerTest.java @@ -97,11 +97,12 @@ public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException public void equals() { AddressBook addressBook = new AddressBookBuilder().withPerson(ALICE).withPerson(BENSON).build(); AddressBook differentAddressBook = new AddressBook(); + TaskList taskList = new TaskList(); UserPrefs userPrefs = new UserPrefs(); // same values -> returns true - modelManager = new ModelManager(addressBook, userPrefs); - ModelManager modelManagerCopy = new ModelManager(addressBook, userPrefs); + modelManager = new ModelManager(addressBook, taskList, userPrefs); + ModelManager modelManagerCopy = new ModelManager(addressBook, taskList, userPrefs); assertTrue(modelManager.equals(modelManagerCopy)); // same object -> returns true @@ -114,12 +115,12 @@ public void equals() { assertFalse(modelManager.equals(5)); // different addressBook -> returns false - assertFalse(modelManager.equals(new ModelManager(differentAddressBook, userPrefs))); + assertFalse(modelManager.equals(new ModelManager(differentAddressBook, taskList, userPrefs))); // different filteredList -> returns false String[] keywords = ALICE.getName().fullName.split("\\s+"); modelManager.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(keywords))); - assertFalse(modelManager.equals(new ModelManager(addressBook, userPrefs))); + assertFalse(modelManager.equals(new ModelManager(addressBook, taskList, userPrefs))); // resets modelManager to initial state for upcoming tests modelManager.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); @@ -127,6 +128,6 @@ public void equals() { // different userPrefs -> returns false UserPrefs differentUserPrefs = new UserPrefs(); differentUserPrefs.setAddressBookFilePath(Paths.get("differentFilePath")); - assertFalse(modelManager.equals(new ModelManager(addressBook, differentUserPrefs))); + assertFalse(modelManager.equals(new ModelManager(addressBook, taskList, differentUserPrefs))); } } diff --git a/src/test/java/seedu/address/storage/StorageManagerTest.java b/src/test/java/seedu/address/storage/StorageManagerTest.java index b8fc4682309..8cc3401994e 100644 --- a/src/test/java/seedu/address/storage/StorageManagerTest.java +++ b/src/test/java/seedu/address/storage/StorageManagerTest.java @@ -26,6 +26,7 @@ public class StorageManagerTest { public void setUp() { JsonAddressBookStorage addressBookStorage = new JsonAddressBookStorage(getTempFilePath("ab")); JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(getTempFilePath("prefs")); + JsonTaskListStorage taskListStorage = new JsonTaskListStorage(getTempFilePath("tasks")); storageManager = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); } From f9024e65fccdbdbe5aefe5668734a9cba9c9bcef Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Thu, 14 Mar 2024 16:23:31 +0800 Subject: [PATCH 08/13] Add more test files Add test classes for new classes and methods. Update old tests in ModelManagerTest and StorageManager to test TaskList methods. --- .../logic/parser/AddTaskCommandParser.java | 6 +-- .../java/seedu/address/model/TaskList.java | 1 + .../java/seedu/address/model/task/Task.java | 15 ++++++ .../logic/commands/AddTaskCommandTest.java | 51 +++++++++++++++++++ .../parser/AddTaskCommandParserTest.java | 28 ++++++++++ .../seedu/address/model/ModelManagerTest.java | 33 +++++++++++- .../seedu/address/model/TaskListTest.java | 48 +++++++++++++++++ .../seedu/address/model/task/TaskTest.java | 42 +++++++++++++++ .../storage/JsonSerializableTaskListTest.java | 38 ++++++++++++++ .../address/storage/StorageManagerTest.java | 5 ++ .../seedu/address/testutil/TypicalTasks.java | 29 +++++++++++ 11 files changed, 291 insertions(+), 5 deletions(-) create mode 100644 src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java create mode 100644 src/test/java/seedu/address/logic/parser/AddTaskCommandParserTest.java create mode 100644 src/test/java/seedu/address/model/TaskListTest.java create mode 100644 src/test/java/seedu/address/model/task/TaskTest.java create mode 100644 src/test/java/seedu/address/storage/JsonSerializableTaskListTest.java create mode 100644 src/test/java/seedu/address/testutil/TypicalTasks.java diff --git a/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java index 5d2efe7ee0c..e7f73311ce6 100644 --- a/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java @@ -19,13 +19,11 @@ public class AddTaskCommandParser implements Parser { */ @Override public AddTaskCommand parse(String userInput) throws ParseException { - String description = userInput; - - if (description.isEmpty()) { + if (userInput.isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddTaskCommand.MESSAGE_USAGE)); } - Task task = new Task(description); + Task task = new Task(userInput); return new AddTaskCommand(task); } diff --git a/src/main/java/seedu/address/model/TaskList.java b/src/main/java/seedu/address/model/TaskList.java index ffd12ac5d4a..828f5ead783 100644 --- a/src/main/java/seedu/address/model/TaskList.java +++ b/src/main/java/seedu/address/model/TaskList.java @@ -41,4 +41,5 @@ public ObservableList getSerializeTaskList() { public boolean hasTask(Task task) { return taskList.contains(task); } + } diff --git a/src/main/java/seedu/address/model/task/Task.java b/src/main/java/seedu/address/model/task/Task.java index 033178e9533..a7af16a2096 100644 --- a/src/main/java/seedu/address/model/task/Task.java +++ b/src/main/java/seedu/address/model/task/Task.java @@ -21,4 +21,19 @@ public Task(String description) { public String getDescription() { return description; } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + //instanceof handles null + if (!(other instanceof Task)) { + return false; + } + + Task otherTask = (Task) other; + return this.getDescription().equals(((Task) other).getDescription()); + } } diff --git a/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java b/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java new file mode 100644 index 00000000000..a6edccbd90c --- /dev/null +++ b/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java @@ -0,0 +1,51 @@ +package seedu.address.logic.commands; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +import seedu.address.model.task.Task; + +class AddTaskCommandTest { + + @Test + public void constructor_nullTask_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new AddTaskCommand(null)); + } + + @Test + void execute() { + } + + @Test + void testEquals() { + Task testTask1 = new Task("test1"); + Task testTask2 = new Task("test2"); + AddTaskCommand addTaskCommand1 = new AddTaskCommand(testTask1); + AddTaskCommand addTaskCommand2 = new AddTaskCommand(testTask2); + + // same object -> returns true + assertTrue(addTaskCommand1.equals(addTaskCommand1)); + + // different types -> returns false + assertFalse(addTaskCommand1.equals(1)); + + // null -> returns false + assertFalse(addTaskCommand1.equals(null)); + + // different tasks -> returns false + assertFalse(addTaskCommand1.equals(addTaskCommand2)); + } + + @Test + void testToString() { + Task test = new Task("test"); + AddTaskCommand addTaskCommand = new AddTaskCommand(test); + String expected = AddTaskCommand.class.getCanonicalName() + "{toAdd=" + test + "}"; + assertEquals(expected, addTaskCommand.toString()); + } + +} diff --git a/src/test/java/seedu/address/logic/parser/AddTaskCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddTaskCommandParserTest.java new file mode 100644 index 00000000000..2b78ad9f901 --- /dev/null +++ b/src/test/java/seedu/address/logic/parser/AddTaskCommandParserTest.java @@ -0,0 +1,28 @@ +package seedu.address.logic.parser; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import seedu.address.logic.commands.AddTaskCommand; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.task.Task; + +public class AddTaskCommandParserTest { + + private AddTaskCommandParser parser = new AddTaskCommandParser(); + + @Test + public void parse_validInput_success() throws ParseException { + String userInput = "Test Task"; + AddTaskCommand expectedCommand = new AddTaskCommand(new Task(userInput)); + assertEquals(expectedCommand.getClass(), parser.parse(userInput).getClass()); + } + + @Test + public void parse_emptyInput_throwsParseException() { + String userInput = ""; + assertThrows(ParseException.class, () -> parser.parse(userInput)); + } +} diff --git a/src/test/java/seedu/address/model/ModelManagerTest.java b/src/test/java/seedu/address/model/ModelManagerTest.java index b9a4a14eb53..f627fdba1b2 100644 --- a/src/test/java/seedu/address/model/ModelManagerTest.java +++ b/src/test/java/seedu/address/model/ModelManagerTest.java @@ -7,6 +7,7 @@ import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalPersons.ALICE; import static seedu.address.testutil.TypicalPersons.BENSON; +import static seedu.address.testutil.TypicalTasks.TASK_1; import java.nio.file.Path; import java.nio.file.Paths; @@ -17,6 +18,7 @@ import seedu.address.commons.core.GuiSettings; import seedu.address.model.person.NameContainsKeywordsPredicate; import seedu.address.testutil.AddressBookBuilder; +import seedu.address.testutil.TypicalTasks; public class ModelManagerTest { @@ -72,6 +74,18 @@ public void setAddressBookFilePath_validPath_setsAddressBookFilePath() { assertEquals(path, modelManager.getAddressBookFilePath()); } + @Test + public void setTaskListFilePath_nullPath_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> modelManager.setTaskListFilePath(null)); + } + + @Test + public void setTaskListFilePath_validPath_setTaskListFilePath() { + Path path = Paths.get("task/list/file/path"); + modelManager.setTaskListFilePath(path); + assertEquals(path, modelManager.getTaskListFilePath()); + } + @Test public void hasPerson_nullPerson_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> modelManager.hasPerson(null)); @@ -88,6 +102,22 @@ public void hasPerson_personInAddressBook_returnsTrue() { assertTrue(modelManager.hasPerson(ALICE)); } + @Test + public void hasTask_nullTask_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> modelManager.hasTask(null)); + } + + @Test + public void hasTask_taskNotInTaskList_returnsFalse() { + assertFalse(modelManager.hasTask(TASK_1)); + } + + @Test + public void hasTask_taskInTaskList_returnsTrue() { + modelManager.addTask(TASK_1); + assertTrue(modelManager.hasTask(TASK_1)); + } + @Test public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() { assertThrows(UnsupportedOperationException.class, () -> modelManager.getFilteredPersonList().remove(0)); @@ -97,7 +127,8 @@ public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException public void equals() { AddressBook addressBook = new AddressBookBuilder().withPerson(ALICE).withPerson(BENSON).build(); AddressBook differentAddressBook = new AddressBook(); - TaskList taskList = new TaskList(); + TaskList taskList = TypicalTasks.getTypicalTaskList(); + TaskList differentTaskList = new TaskList(); UserPrefs userPrefs = new UserPrefs(); // same values -> returns true diff --git a/src/test/java/seedu/address/model/TaskListTest.java b/src/test/java/seedu/address/model/TaskListTest.java new file mode 100644 index 00000000000..da0defdaf79 --- /dev/null +++ b/src/test/java/seedu/address/model/TaskListTest.java @@ -0,0 +1,48 @@ +package seedu.address.model; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import seedu.address.model.task.Task; + +public class TaskListTest { + + private TaskList taskList; + private Task task1; + private Task task2; + + @BeforeEach + public void setUp() { + taskList = new TaskList(); + task1 = new Task("Task 1"); + task2 = new Task("Task 2"); + } + + @Test + public void addTask_success() { + taskList.addTask(task1); + assertTrue(taskList.hasTask(task1)); + } + + @Test + public void hasTask_success() { + taskList.addTask(task1); + assertTrue(taskList.hasTask(task1)); + } + + @Test + public void hasTask_failure() { + assertFalse(taskList.hasTask(task1)); + } + + @Test + public void getSerializeTaskList_success() { + taskList.addTask(task1); + taskList.addTask(task2); + assertEquals(2, taskList.getSerializeTaskList().size()); + } +} diff --git a/src/test/java/seedu/address/model/task/TaskTest.java b/src/test/java/seedu/address/model/task/TaskTest.java new file mode 100644 index 00000000000..3df0cb68d66 --- /dev/null +++ b/src/test/java/seedu/address/model/task/TaskTest.java @@ -0,0 +1,42 @@ +package seedu.address.model.task; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class TaskTest { + + @Test + public void constructor_validInput_success() { + Task task = new Task("Test Task"); + assertEquals("Test Task", task.getDescription()); + } + + @Test + public void equals_sameObject_true() { + Task task = new Task("Test Task"); + assertTrue(task.equals(task)); + } + + @Test + public void equals_differentObjectSameDescription_true() { + Task task1 = new Task("Test Task"); + Task task2 = new Task("Test Task"); + assertTrue(task1.equals(task2)); + } + + @Test + public void equals_differentObjectDifferentDescription_false() { + Task task1 = new Task("Test Task 1"); + Task task2 = new Task("Test Task 2"); + assertFalse(task1.equals(task2)); + } + + @Test + public void equals_differentObjectDifferentType_false() { + Task task = new Task("Test Task"); + assertFalse(task.equals(new Object())); + } +} diff --git a/src/test/java/seedu/address/storage/JsonSerializableTaskListTest.java b/src/test/java/seedu/address/storage/JsonSerializableTaskListTest.java new file mode 100644 index 00000000000..d20713c9612 --- /dev/null +++ b/src/test/java/seedu/address/storage/JsonSerializableTaskListTest.java @@ -0,0 +1,38 @@ +package seedu.address.storage; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.TaskList; +import seedu.address.model.task.Task; + +public class JsonSerializableTaskListTest { + + private static final Task TASK_1 = new Task("Task 1"); + private static final Task TASK_2 = new Task("Task 2"); + + @Test + public void toModelType_validTaskList_success() throws IllegalValueException { + TaskList taskList = new TaskList(); + taskList.addTask(TASK_1); + taskList.addTask(TASK_2); + + JsonSerializableTaskList jsonSerializableTaskList = new JsonSerializableTaskList(taskList); + TaskList modelTaskList = jsonSerializableTaskList.toModelType(); + + assertEquals(taskList.getSerializeTaskList(), modelTaskList.getSerializeTaskList()); + } + + @Test + public void toModelType_duplicateTasks_throwsIllegalValueException() { + TaskList taskList = new TaskList(); + taskList.addTask(TASK_1); + taskList.addTask(TASK_1); // Duplicate task + + JsonSerializableTaskList jsonSerializableTaskList = new JsonSerializableTaskList(taskList); + assertThrows(IllegalValueException.class, jsonSerializableTaskList::toModelType); + } +} diff --git a/src/test/java/seedu/address/storage/StorageManagerTest.java b/src/test/java/seedu/address/storage/StorageManagerTest.java index 8cc3401994e..0eed8b21446 100644 --- a/src/test/java/seedu/address/storage/StorageManagerTest.java +++ b/src/test/java/seedu/address/storage/StorageManagerTest.java @@ -66,4 +66,9 @@ public void getAddressBookFilePath() { assertNotNull(storageManager.getAddressBookFilePath()); } + @Test + public void getTaskListFilePath() { + assertNotNull(storageManager.getTaskListFilePath()); + } + } diff --git a/src/test/java/seedu/address/testutil/TypicalTasks.java b/src/test/java/seedu/address/testutil/TypicalTasks.java new file mode 100644 index 00000000000..68215318f05 --- /dev/null +++ b/src/test/java/seedu/address/testutil/TypicalTasks.java @@ -0,0 +1,29 @@ +package seedu.address.testutil; + +import seedu.address.model.TaskList; +import seedu.address.model.task.Task; + +/** + * A utility class containing a list of {@code Task} objects to be used in tests. + */ +public class TypicalTasks { + public static final Task TASK_1 = new Task("task1"); + public static final Task TASK_2 = new Task("task2"); + public static final Task TASK_3 = new Task("task3"); + + private static TaskList tasks = new TaskList(); + + public static TaskList get() { + return tasks; + } + + /** + * Returns an {@code TaskList} with all the sample tasks. + */ + public static TaskList getTypicalTaskList() { + tasks.addTask(TASK_1); + tasks.addTask(TASK_2); + tasks.addTask(TASK_3); + return TypicalTasks.get(); + } +} From cda4b668cd45d0da6c16f5d501ad5976edfa0858 Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Thu, 14 Mar 2024 17:25:12 +0800 Subject: [PATCH 09/13] Add more test files Add more test classes for new classes and methods. --- .../validTaskList.json | 9 +++ .../logic/commands/AddTaskCommandTest.java | 27 +++++++- .../address/storage/JsonAdaptedTaskTest.java | 36 +++++++++++ .../storage/JsonTaskListStorageTest.java | 64 +++++++++++++++++++ 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/test/data/JsonTaskListStorageTest/validTaskList.json create mode 100644 src/test/java/seedu/address/storage/JsonAdaptedTaskTest.java create mode 100644 src/test/java/seedu/address/storage/JsonTaskListStorageTest.java diff --git a/src/test/data/JsonTaskListStorageTest/validTaskList.json b/src/test/data/JsonTaskListStorageTest/validTaskList.json new file mode 100644 index 00000000000..68abec59421 --- /dev/null +++ b/src/test/data/JsonTaskListStorageTest/validTaskList.json @@ -0,0 +1,9 @@ +{ + "tasks" : [ { + "description" : "test 1" + }, { + "description" : "test 2" + }, { + "description" : "test 3" + } ] +} \ No newline at end of file diff --git a/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java b/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java index a6edccbd90c..3736daaff5d 100644 --- a/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java @@ -5,19 +5,44 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.testutil.Assert.assertThrows; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.model.ModelManager; import seedu.address.model.task.Task; class AddTaskCommandTest { + private ModelManager model; + + @BeforeEach + public void setUp() { + model = new ModelManager(); + } + + @Test public void constructor_nullTask_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> new AddTaskCommand(null)); } @Test - void execute() { + public void execute_taskAcceptedByModel_addSuccessful() throws Exception { + Task validTask = new Task("sample"); + + CommandResult commandResult = new AddTaskCommand(validTask).execute(model); + + assertTrue(model.hasTask(validTask)); + } + + @Test + public void execute_duplicateTask_throwsCommandException() throws CommandException { + Task validTask = new Task("sample"); + new AddTaskCommand(validTask).execute(model); + + assertThrows(CommandException.class, + AddTaskCommand.MESSAGE_DUPLICATE_TASK, () -> new AddTaskCommand(validTask).execute(model)); } @Test diff --git a/src/test/java/seedu/address/storage/JsonAdaptedTaskTest.java b/src/test/java/seedu/address/storage/JsonAdaptedTaskTest.java new file mode 100644 index 00000000000..17ae9402b35 --- /dev/null +++ b/src/test/java/seedu/address/storage/JsonAdaptedTaskTest.java @@ -0,0 +1,36 @@ +package seedu.address.storage; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.task.Task; + +public class JsonAdaptedTaskTest { + + private static final String VALID_DESCRIPTION = "Valid Task Description"; + private static final String EMPTY_DESCRIPTION = ""; + + @Test + public void toModelType_validDescription_success() throws IllegalValueException { + JsonAdaptedTask jsonAdaptedTask = new JsonAdaptedTask(VALID_DESCRIPTION); + Task modelTask = jsonAdaptedTask.toModelType(); + assertEquals(VALID_DESCRIPTION, modelTask.getDescription()); + } + + @Test + public void toModelType_emptyDescription_throwsIllegalValueException() { + JsonAdaptedTask jsonAdaptedTask = new JsonAdaptedTask(EMPTY_DESCRIPTION); + assertThrows(IllegalValueException.class, jsonAdaptedTask::toModelType); + } + + @Test + public void toModelType_fromTask_success() throws IllegalValueException { + Task task = new Task(VALID_DESCRIPTION); + JsonAdaptedTask jsonAdaptedTask = new JsonAdaptedTask(task); + Task modelTask = jsonAdaptedTask.toModelType(); + assertEquals(task.getDescription(), modelTask.getDescription()); + } +} diff --git a/src/test/java/seedu/address/storage/JsonTaskListStorageTest.java b/src/test/java/seedu/address/storage/JsonTaskListStorageTest.java new file mode 100644 index 00000000000..f8a9b57c78a --- /dev/null +++ b/src/test/java/seedu/address/storage/JsonTaskListStorageTest.java @@ -0,0 +1,64 @@ +package seedu.address.storage; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + +import org.junit.jupiter.api.Test; + +import seedu.address.model.TaskList; +import seedu.address.model.task.Task; + +public class JsonTaskListStorageTest { + + private static TaskList taskList = new TaskList(); + private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonTaskListStorageTest"); + @Test + public void readTaskList_missingFile_emptyResult() throws Exception { + assertFalse(readTaskList("NonExistentFile.json").isPresent()); + } + @Test + public void saveTaskList_nullTaskList_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> saveTaskList(null, "SomeFile.json")); + } + private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) { + return prefsFileInTestDataFolder != null + ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder) + : null; + } + + private Optional readTaskList(String filePath) throws Exception { + return new JsonTaskListStorage(Paths.get(filePath)).readTaskList(addToTestDataPathIfNotNull(filePath)); + } + + private Optional readTaskList(Path filePath) throws Exception { + return new JsonTaskListStorage(filePath).readTaskList(filePath); + } + + private void saveTaskList(TaskList taskList, String filePath) throws IOException { + try { + new JsonTaskListStorage(Paths.get(filePath)).saveTaskList(taskList, addToTestDataPathIfNotNull(filePath)); + } catch (IOException ioe) { + throw new AssertionError("There should not be an error writing to the file.", ioe); + } + } + + private void saveTaskList(TaskList taskList, Path filePath) throws IOException { + try { + new JsonTaskListStorage(filePath).saveTaskList(taskList, filePath); + } catch (IOException ioe) { + throw new AssertionError("There should not be an error writing to the file.", ioe); + } + } + + private static TaskList getTypicalTaskList() { + taskList.addTask(new Task("test 1")); + taskList.addTask(new Task("test 2")); + taskList.addTask(new Task("test 3")); + return taskList; + } +} From 74c69c4395b34ba9b5b05bc904cabde1ccb69a14 Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Thu, 14 Mar 2024 18:18:19 +0800 Subject: [PATCH 10/13] Add more tests Add more tests for more methods. --- .../validTaskList.json | 2 +- .../storage/JsonTaskListStorageTest.java | 34 +++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/test/data/JsonTaskListStorageTest/validTaskList.json b/src/test/data/JsonTaskListStorageTest/validTaskList.json index 68abec59421..ebf1a190821 100644 --- a/src/test/data/JsonTaskListStorageTest/validTaskList.json +++ b/src/test/data/JsonTaskListStorageTest/validTaskList.json @@ -6,4 +6,4 @@ }, { "description" : "test 3" } ] -} \ No newline at end of file +} diff --git a/src/test/java/seedu/address/storage/JsonTaskListStorageTest.java b/src/test/java/seedu/address/storage/JsonTaskListStorageTest.java index f8a9b57c78a..8559c1651a3 100644 --- a/src/test/java/seedu/address/storage/JsonTaskListStorageTest.java +++ b/src/test/java/seedu/address/storage/JsonTaskListStorageTest.java @@ -1,6 +1,7 @@ package seedu.address.storage; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.IOException; @@ -9,14 +10,20 @@ import java.util.Optional; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import seedu.address.model.TaskList; import seedu.address.model.task.Task; +import seedu.address.testutil.Assert; public class JsonTaskListStorageTest { private static TaskList taskList = new TaskList(); private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonTaskListStorageTest"); + + @TempDir + public Path testFolder; + @Test public void readTaskList_missingFile_emptyResult() throws Exception { assertFalse(readTaskList("NonExistentFile.json").isPresent()); @@ -34,11 +41,6 @@ private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) { private Optional readTaskList(String filePath) throws Exception { return new JsonTaskListStorage(Paths.get(filePath)).readTaskList(addToTestDataPathIfNotNull(filePath)); } - - private Optional readTaskList(Path filePath) throws Exception { - return new JsonTaskListStorage(filePath).readTaskList(filePath); - } - private void saveTaskList(TaskList taskList, String filePath) throws IOException { try { new JsonTaskListStorage(Paths.get(filePath)).saveTaskList(taskList, addToTestDataPathIfNotNull(filePath)); @@ -47,12 +49,20 @@ private void saveTaskList(TaskList taskList, String filePath) throws IOException } } - private void saveTaskList(TaskList taskList, Path filePath) throws IOException { - try { - new JsonTaskListStorage(filePath).saveTaskList(taskList, filePath); - } catch (IOException ioe) { - throw new AssertionError("There should not be an error writing to the file.", ioe); - } + @Test + public void readAndSaveTaskList_allInOrder_success() throws Exception { + Path filePath = testFolder.resolve("TempTaskList.json"); + TaskList sample = getTypicalTaskList(); + JsonTaskListStorage jsonTaskListStorage = new JsonTaskListStorage(filePath); + + // Save in new file and read back + jsonTaskListStorage.saveTaskList(sample, filePath); + TaskList readBack = jsonTaskListStorage.readTaskList(filePath).get(); + assertNotNull(readBack); + } + @Test + public void saveTaskList_nullFilePath_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> saveTaskList(new TaskList(), null)); } private static TaskList getTypicalTaskList() { @@ -61,4 +71,6 @@ private static TaskList getTypicalTaskList() { taskList.addTask(new Task("test 3")); return taskList; } + } + From cbed9182f8663be7cbe7b381b1b4e56ddccb122f Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Thu, 14 Mar 2024 18:37:48 +0800 Subject: [PATCH 11/13] Update StorageManagerTest Add test to taskList methods in StorageManager. --- .../java/seedu/address/storage/StorageManagerTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/test/java/seedu/address/storage/StorageManagerTest.java b/src/test/java/seedu/address/storage/StorageManagerTest.java index 0eed8b21446..cdd8b73ce14 100644 --- a/src/test/java/seedu/address/storage/StorageManagerTest.java +++ b/src/test/java/seedu/address/storage/StorageManagerTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; +import static seedu.address.testutil.TypicalTasks.getTypicalTaskList; import java.nio.file.Path; @@ -13,6 +14,7 @@ import seedu.address.commons.core.GuiSettings; import seedu.address.model.AddressBook; import seedu.address.model.ReadOnlyAddressBook; +import seedu.address.model.TaskList; import seedu.address.model.UserPrefs; public class StorageManagerTest { @@ -61,6 +63,13 @@ public void addressBookReadSave() throws Exception { assertEquals(original, new AddressBook(retrieved)); } + @Test + public void taskListReadSave() throws Exception { + TaskList sample = getTypicalTaskList(); + assertNotNull(sample); + + } + @Test public void getAddressBookFilePath() { assertNotNull(storageManager.getAddressBookFilePath()); From aa11001e021c226ac9243e9177dcb62b3704dd1b Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Thu, 14 Mar 2024 19:08:11 +0800 Subject: [PATCH 12/13] Fix StorageManagerTest Fix tests for taskList methods in StorageManager. --- .../seedu/address/storage/StorageManagerTest.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/test/java/seedu/address/storage/StorageManagerTest.java b/src/test/java/seedu/address/storage/StorageManagerTest.java index cdd8b73ce14..c84dfbbbabc 100644 --- a/src/test/java/seedu/address/storage/StorageManagerTest.java +++ b/src/test/java/seedu/address/storage/StorageManagerTest.java @@ -28,7 +28,7 @@ public class StorageManagerTest { public void setUp() { JsonAddressBookStorage addressBookStorage = new JsonAddressBookStorage(getTempFilePath("ab")); JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(getTempFilePath("prefs")); - JsonTaskListStorage taskListStorage = new JsonTaskListStorage(getTempFilePath("tasks")); + JsonTaskListStorage taskListStorage = new JsonTaskListStorage(getTempFilePath("samples")); storageManager = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage); } @@ -64,10 +64,11 @@ public void addressBookReadSave() throws Exception { } @Test - public void taskListReadSave() throws Exception { - TaskList sample = getTypicalTaskList(); - assertNotNull(sample); - + public void taskListSaveTest() throws Exception { + TaskList testList = getTypicalTaskList(); + Path testPath = getTempFilePath("test"); + storageManager.saveTaskList(testList, testPath); + assertNotNull(testList); } @Test From c809106d73796f5d64874a608c2cbec33b79cce7 Mon Sep 17 00:00:00 2001 From: Kaya3842 Date: Thu, 14 Mar 2024 19:38:30 +0800 Subject: [PATCH 13/13] Add more test files Add more test classes for new classes and methods. --- .../logic/commands/AddTaskCommandTest.java | 4 ++++ .../logic/parser/AddressBookParserTest.java | 11 +++++++++++ .../seedu/address/model/ModelManagerTest.java | 1 + .../java/seedu/address/testutil/TaskUtil.java | 17 +++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 src/test/java/seedu/address/testutil/TaskUtil.java diff --git a/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java b/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java index 3736daaff5d..8939b55d352 100644 --- a/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddTaskCommandTest.java @@ -55,6 +55,10 @@ void testEquals() { // same object -> returns true assertTrue(addTaskCommand1.equals(addTaskCommand1)); + // same values -> returns false + AddTaskCommand addTaskCommandCopy1 = new AddTaskCommand(testTask1); + assertFalse(addTaskCommandCopy1.equals(addTaskCommand1)); + // different types -> returns false assertFalse(addTaskCommand1.equals(1)); diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index 5a1ab3dbc0c..d548a0bd57b 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -1,6 +1,7 @@ package seedu.address.logic.parser; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND; @@ -14,6 +15,7 @@ import org.junit.jupiter.api.Test; import seedu.address.logic.commands.AddCommand; +import seedu.address.logic.commands.AddTaskCommand; import seedu.address.logic.commands.ClearCommand; import seedu.address.logic.commands.DeleteCommand; import seedu.address.logic.commands.EditCommand; @@ -25,9 +27,11 @@ import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.person.NameContainsKeywordsPredicate; import seedu.address.model.person.Person; +import seedu.address.model.task.Task; import seedu.address.testutil.EditPersonDescriptorBuilder; import seedu.address.testutil.PersonBuilder; import seedu.address.testutil.PersonUtil; +import seedu.address.testutil.TaskUtil; public class AddressBookParserTest { @@ -40,6 +44,13 @@ public void parseCommand_add() throws Exception { assertEquals(new AddCommand(person), command); } + @Test + public void parseCommand_addtask() throws Exception { + Task task = new Task("test"); + AddTaskCommand command = (AddTaskCommand) parser.parseCommand(TaskUtil.getAddTaskCommand(task)); + assertNotNull(command); + } + @Test public void parseCommand_clear() throws Exception { assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD) instanceof ClearCommand); diff --git a/src/test/java/seedu/address/model/ModelManagerTest.java b/src/test/java/seedu/address/model/ModelManagerTest.java index f627fdba1b2..c5549b6acb1 100644 --- a/src/test/java/seedu/address/model/ModelManagerTest.java +++ b/src/test/java/seedu/address/model/ModelManagerTest.java @@ -22,6 +22,7 @@ public class ModelManagerTest { + private TaskList taskList = new TaskList(); private ModelManager modelManager = new ModelManager(); @Test diff --git a/src/test/java/seedu/address/testutil/TaskUtil.java b/src/test/java/seedu/address/testutil/TaskUtil.java new file mode 100644 index 00000000000..1545e010576 --- /dev/null +++ b/src/test/java/seedu/address/testutil/TaskUtil.java @@ -0,0 +1,17 @@ +package seedu.address.testutil; + +import seedu.address.logic.commands.AddTaskCommand; +import seedu.address.model.task.Task; + +/** + * A utility class for Task. + */ +public class TaskUtil { + + /** + * Returns an add command string for adding the {@code person}. + */ + public static String getAddTaskCommand(Task task) { + return AddTaskCommand.COMMAND_WORD + " " + task.getDescription(); + } +}