medLoggerOptional;
+ ReadOnlyMedLogger initialData;
try {
- addressBookOptional = storage.readAddressBook();
- if (!addressBookOptional.isPresent()) {
- logger.info("Creating a new data file " + storage.getAddressBookFilePath()
- + " populated with a sample AddressBook.");
+ medLoggerOptional = storage.readMedLogger();
+ if (!medLoggerOptional.isPresent()) {
+ logger.info("Creating a new data file " + storage.getMedLoggerFilePath()
+ + " populated with a sample MedLogger.");
}
- initialData = addressBookOptional.orElseGet(SampleDataUtil::getSampleAddressBook);
+ initialData = medLoggerOptional.orElseGet(SampleDataUtil::getSampleMedLogger);
} catch (DataLoadingException e) {
- logger.warning("Data file at " + storage.getAddressBookFilePath() + " could not be loaded."
- + " Will be starting with an empty AddressBook.");
- initialData = new AddressBook();
+ logger.warning("Data file at " + storage.getMedLoggerFilePath() + " could not be loaded."
+ + " Will be starting with an empty MedLogger.");
+ initialData = new MedLogger();
}
return new ModelManager(initialData, userPrefs);
@@ -170,13 +170,13 @@ protected UserPrefs initPrefs(UserPrefsStorage storage) {
@Override
public void start(Stage primaryStage) {
- logger.info("Starting AddressBook " + MainApp.VERSION);
+ logger.info("Starting MedLogger " + MainApp.VERSION);
ui.start(primaryStage);
}
@Override
public void stop() {
- logger.info("============================ [ Stopping AddressBook ] =============================");
+ logger.info("============================ [ Stopping MedLogger ] =============================");
try {
storage.saveUserPrefs(model.getUserPrefs());
} catch (IOException e) {
diff --git a/src/main/java/seedu/address/commons/core/LogsCenter.java b/src/main/java/seedu/address/commons/core/LogsCenter.java
index 8cf8e15a0f0..97c2834f18f 100644
--- a/src/main/java/seedu/address/commons/core/LogsCenter.java
+++ b/src/main/java/seedu/address/commons/core/LogsCenter.java
@@ -20,7 +20,7 @@
public class LogsCenter {
private static final int MAX_FILE_COUNT = 5;
private static final int MAX_FILE_SIZE_IN_BYTES = (int) (Math.pow(2, 20) * 5); // 5MB
- private static final String LOG_FILE = "addressbook.log";
+ private static final String LOG_FILE = "medlogger.log";
private static final Logger logger; // logger for this class
private static Logger baseLogger; // to be used as the parent of all other loggers created by this class.
private static Level currentLogLevel = Level.INFO;
diff --git a/src/main/java/seedu/address/commons/core/index/Index.java b/src/main/java/seedu/address/commons/core/index/Index.java
index dd170d8b68d..006976e4e80 100644
--- a/src/main/java/seedu/address/commons/core/index/Index.java
+++ b/src/main/java/seedu/address/commons/core/index/Index.java
@@ -4,7 +4,7 @@
/**
* Represents a zero-based or one-based index.
- *
+ *
* {@code Index} should be used right from the start (when parsing in a new user input), so that if the current
* component wants to communicate with another component, it can send an {@code Index} to avoid having to know what
* base the other component is using for its index. However, after receiving the {@code Index}, that component can
diff --git a/src/main/java/seedu/address/commons/util/FileUtil.java b/src/main/java/seedu/address/commons/util/FileUtil.java
index b1e2767cdd9..5fbeb7617f3 100644
--- a/src/main/java/seedu/address/commons/util/FileUtil.java
+++ b/src/main/java/seedu/address/commons/util/FileUtil.java
@@ -1,10 +1,22 @@
package seedu.address.commons.util;
+import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javafx.stage.FileChooser;
/**
* Writes and reads files
@@ -18,7 +30,8 @@ public static boolean isFileExists(Path file) {
}
/**
- * Returns true if {@code path} can be converted into a {@code Path} via {@link Paths#get(String)},
+ * Returns true if {@code path} can be converted into a {@code Path} via
+ * {@link java.nio.file.Paths#get(String, String...)},
* otherwise returns false.
* @param path A string representing the file path. Cannot be null.
*/
@@ -80,4 +93,145 @@ public static void writeToFile(Path file, String content) throws IOException {
Files.write(file, content.getBytes(CHARSET));
}
+ /**
+ * Opens a file save dialog. After user specify the saved location from the dialog,
+ * exports a file from sourcePath as either JSON or CSV.
+ *
+ * @param sourcePath the path to the source JSON file containing the data to export
+ * @param fileType the type of file to export ("json" or "csv")
+ * @param defaultName the default file name to suggest in the save dialog
+ * @throws IOException if the user cancels the save dialog, the file type is invalid,
+ * data parsing fails, or writing to the selected file fails
+ */
+ public static void saveWithDialog(Path sourcePath, String fileType, String defaultName) throws IOException {
+ File selectedFile = FileUtil.promptSaveDialog(fileType, defaultName);
+ if (selectedFile == null) {
+ throw new IOException("Export cancelled by user.");
+ }
+
+ String content = FileUtil.readFromFile(sourcePath);
+ if (fileType.equals("json")) {
+ FileUtil.writeToFile(selectedFile.toPath(), content);
+ } else if (fileType.equals("csv")) {
+
+ List> rows;
+ try {
+ rows = extractJsonObjects(content, "persons");
+ } catch (Exception e) {
+ throw new IOException("Error when parsing the file");
+ }
+
+ if (rows.isEmpty()) {
+ throw new IOException("No data to export.");
+ }
+
+ StringBuilder csvBuilder = buildCsvString(rows);
+ FileUtil.writeToFile(selectedFile.toPath(), csvBuilder.toString());
+
+ } else {
+ throw new IOException("Invalid fileType");
+ }
+
+ }
+
+ /**
+ * Extracts a list of JSON objects from the given JSON string, based on a specified array key.
+ * Each object is converted to a map of string key-value pairs.
+ *
+ * @param json the JSON string containing an array of objects
+ * @param arrayKey the key that points to the array within the root JSON object
+ * @return a list of maps representing the JSON objects in the array; empty if the key is missing or not an array
+ * @throws Exception if JSON parsing fails
+ */
+ public static List> extractJsonObjects(String json, String arrayKey) throws Exception {
+ ObjectMapper mapper = new ObjectMapper();
+ JsonNode root = mapper.readTree(json);
+ JsonNode arrayNode = root.get(arrayKey);
+
+ if (arrayNode == null || !arrayNode.isArray()) {
+ return Collections.emptyList();
+ }
+
+ List> result = new ArrayList<>();
+
+ for (JsonNode node : arrayNode) {
+ Map map = new HashMap<>();
+ Iterator> fields = node.fields();
+
+
+ while (fields.hasNext()) {
+ Map.Entry entry = fields.next();
+ map.put(entry.getKey(), entry.getValue().toString().replaceAll("^\"|\"$", ""));
+ }
+
+ result.add(map);
+ }
+
+ return result;
+ }
+
+ /**
+ * Encloses the given value in double quotes if it contains special characters such as commas or quotes,
+ * and escapes any internal quotes by doubling them (for valid CSV formatting).
+ *
+ * @param value the string value to quote if necessary
+ * @return the quoted string, or the original string if no quoting is needed
+ */
+ public static String quote(String value) {
+ if (value.contains(",") || value.contains("\"")) {
+ return "\"" + value.replace("\"", "\"\"") + "\"";
+ }
+ return value;
+ }
+
+ /**
+ * Opens a JavaFX save file dialog with the specified file type and default name.
+ *
+ * @param fileType The file extension type (e.g. "csv" or "json").
+ * @param defaultName The default file name to suggest.
+ * @return The file selected by the user, or {@code null} if the dialog was cancelled.
+ */
+ private static File promptSaveDialog(String fileType, String defaultName) {
+ // Use JavaFX FileChooser to prompt the user for save location
+ FileChooser fileChooser = new FileChooser();
+
+ // Set the appropriate file extension filter
+ String s1 = fileType.toUpperCase() + " Files";
+ String s2 = "*." + fileType;
+
+ fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(s1, s2));
+ fileChooser.setTitle("Save " + fileType.toUpperCase() + " File");
+
+ // Suggest default file name
+ fileChooser.setInitialFileName(defaultName);
+
+ return fileChooser.showSaveDialog(null);
+ }
+
+ /**
+ * Builds a CSV-formatted string from a list of row maps.
+ * Assumes all rows share the same set of keys.
+ *
+ * @param rows The list of rows to include in the CSV.
+ * @return A StringBuilder containing the CSV data.
+ */
+ private static StringBuilder buildCsvString(List> rows) {
+ // Get keys from first object (assumes all rows have same structure)
+ List headers = new ArrayList<>(rows.get(0).keySet());
+ StringBuilder csvBuilder = new StringBuilder();
+
+ // Write header
+ csvBuilder.append(String.join(",", headers)).append("\n");
+
+ // Write rows
+ for (Map row : rows) {
+ List cells = new ArrayList<>();
+ for (String key : headers) {
+ String value = row.getOrDefault(key, "");
+ cells.add(quote(value));
+ }
+ csvBuilder.append(String.join(",", cells)).append("\n");
+ }
+ return csvBuilder;
+ }
}
diff --git a/src/main/java/seedu/address/logic/Logic.java b/src/main/java/seedu/address/logic/Logic.java
index 92cd8fa605a..c9bd8bcaf96 100644
--- a/src/main/java/seedu/address/logic/Logic.java
+++ b/src/main/java/seedu/address/logic/Logic.java
@@ -7,8 +7,9 @@
import seedu.address.logic.commands.CommandResult;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.logic.parser.exceptions.ParseException;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.person.Person;
+import seedu.address.model.person.Visit;
/**
* API of the Logic component
@@ -24,25 +25,41 @@ public interface Logic {
CommandResult execute(String commandText) throws CommandException, ParseException;
/**
- * Returns the AddressBook.
+ * Returns the MedLogger.
*
- * @see seedu.address.model.Model#getAddressBook()
+ * @see seedu.address.model.Model#getMedLogger()
*/
- ReadOnlyAddressBook getAddressBook();
+ ReadOnlyMedLogger getMedLogger();
/** Returns an unmodifiable view of the filtered list of persons */
ObservableList getFilteredPersonList();
/**
- * Returns the user prefs' address book file path.
+ * Returns an unmodifiable view of the filtered list of visits
*/
- Path getAddressBookFilePath();
+ ObservableList getFilteredVisitList();
+
+ /**
+ * Returns an unmodifiable view of the sorted list of visits
+ */
+ ObservableList getSortedVisitList();
+
+ /**
+ * Returns the user prefs' Med Logger file path.
+ */
+ Path getMedLoggerFilePath();
/**
* Returns the user prefs' GUI settings.
*/
GuiSettings getGuiSettings();
+ /**
+ * Updates the filtered list of persons to filter by the given {@code predicate}.
+ * @param predicate The predicate to filter the list of persons.
+ */
+ void updateFilteredVisitList(java.util.function.Predicate predicate);
+
/**
* Set the user prefs' GUI settings.
*/
diff --git a/src/main/java/seedu/address/logic/LogicManager.java b/src/main/java/seedu/address/logic/LogicManager.java
index 5aa3b91c7d0..c00305b1706 100644
--- a/src/main/java/seedu/address/logic/LogicManager.java
+++ b/src/main/java/seedu/address/logic/LogicManager.java
@@ -1,8 +1,11 @@
package seedu.address.logic;
+import static java.util.Objects.requireNonNull;
+
import java.io.IOException;
import java.nio.file.AccessDeniedException;
import java.nio.file.Path;
+import java.util.function.Predicate;
import java.util.logging.Logger;
import javafx.collections.ObservableList;
@@ -11,11 +14,12 @@
import seedu.address.logic.commands.Command;
import seedu.address.logic.commands.CommandResult;
import seedu.address.logic.commands.exceptions.CommandException;
-import seedu.address.logic.parser.AddressBookParser;
+import seedu.address.logic.parser.MedLoggerParser;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.Model;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.person.Person;
+import seedu.address.model.person.Visit;
import seedu.address.storage.Storage;
/**
@@ -31,7 +35,7 @@ public class LogicManager implements Logic {
private final Model model;
private final Storage storage;
- private final AddressBookParser addressBookParser;
+ private final MedLoggerParser medLoggerParser;
/**
* Constructs a {@code LogicManager} with the given {@code Model} and {@code Storage}.
@@ -39,7 +43,7 @@ public class LogicManager implements Logic {
public LogicManager(Model model, Storage storage) {
this.model = model;
this.storage = storage;
- addressBookParser = new AddressBookParser();
+ medLoggerParser = new MedLoggerParser();
}
@Override
@@ -47,11 +51,11 @@ public CommandResult execute(String commandText) throws CommandException, ParseE
logger.info("----------------[USER COMMAND][" + commandText + "]");
CommandResult commandResult;
- Command command = addressBookParser.parseCommand(commandText);
+ Command command = medLoggerParser.parseCommand(commandText);
commandResult = command.execute(model);
try {
- storage.saveAddressBook(model.getAddressBook());
+ storage.saveMedLogger(model.getMedLogger());
} catch (AccessDeniedException e) {
throw new CommandException(String.format(FILE_OPS_PERMISSION_ERROR_FORMAT, e.getMessage()), e);
} catch (IOException ioe) {
@@ -62,8 +66,8 @@ public CommandResult execute(String commandText) throws CommandException, ParseE
}
@Override
- public ReadOnlyAddressBook getAddressBook() {
- return model.getAddressBook();
+ public ReadOnlyMedLogger getMedLogger() {
+ return model.getMedLogger();
}
@Override
@@ -72,8 +76,24 @@ public ObservableList getFilteredPersonList() {
}
@Override
- public Path getAddressBookFilePath() {
- return model.getAddressBookFilePath();
+ public ObservableList getFilteredVisitList() {
+ return model.getFilteredVisitList();
+ }
+
+ @Override
+ public ObservableList getSortedVisitList() {
+ return model.getSortedVisitList();
+ }
+
+ @Override
+ public void updateFilteredVisitList(Predicate predicate) {
+ requireNonNull(predicate);
+ model.updateFilteredVisitList(predicate);
+ }
+
+ @Override
+ public Path getMedLoggerFilePath() {
+ return model.getMedLoggerFilePath();
}
@Override
diff --git a/src/main/java/seedu/address/logic/Messages.java b/src/main/java/seedu/address/logic/Messages.java
index ecd32c31b53..7ebec71ce89 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.person.Visit;
/**
* Container for user visible messages.
@@ -15,6 +16,7 @@ public class Messages {
public static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command";
public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s";
public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX = "The person index provided is invalid";
+ public static final String MESSAGE_INVALID_VISIT_DISPLAYED_INDEX = "The visit index provided is invalid";
public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
public static final String MESSAGE_DUPLICATE_FIELDS =
"Multiple values specified for the following single-valued field(s): ";
@@ -37,6 +39,8 @@ public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePref
public static String format(Person person) {
final StringBuilder builder = new StringBuilder();
builder.append(person.getName())
+ .append("; Nric: ")
+ .append(person.getNric())
.append("; Phone: ")
.append(person.getPhone())
.append("; Email: ")
@@ -48,4 +52,20 @@ public static String format(Person person) {
return builder.toString();
}
+ /**
+ * Formats the {@code person} for display to the user.
+ */
+ public static String format(Visit visit) {
+ final StringBuilder builder = new StringBuilder();
+ Person person = visit.getPerson();
+ builder.append(person.getName())
+ .append("; Nric: ")
+ .append(person.getNric())
+ .append("; Date: ")
+ .append(visit.getDateTime())
+ .append("; Remark: ")
+ .append(visit.getRemark());
+ return builder.toString();
+ }
+
}
diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddPersonCommand.java
similarity index 77%
rename from src/main/java/seedu/address/logic/commands/AddCommand.java
rename to src/main/java/seedu/address/logic/commands/AddPersonCommand.java
index 5d7185a9680..190763cee35 100644
--- a/src/main/java/seedu/address/logic/commands/AddCommand.java
+++ b/src/main/java/seedu/address/logic/commands/AddPersonCommand.java
@@ -4,6 +4,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
@@ -14,21 +15,23 @@
import seedu.address.model.person.Person;
/**
- * Adds a person to the address book.
+ * Adds a person to the Med Logger.
*/
-public class AddCommand extends Command {
+public class AddPersonCommand extends Command {
- public static final String COMMAND_WORD = "add";
+ public static final String COMMAND_WORD = "person";
- public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a person to the address book. "
+ public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a person to the Med Logger. "
+ "Parameters: "
+ PREFIX_NAME + "NAME "
+ + PREFIX_NRIC + "NRIC "
+ PREFIX_PHONE + "PHONE "
+ PREFIX_EMAIL + "EMAIL "
+ PREFIX_ADDRESS + "ADDRESS "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_NAME + "John Doe "
+ + PREFIX_NRIC + "S1234567A "
+ PREFIX_PHONE + "98765432 "
+ PREFIX_EMAIL + "johnd@example.com "
+ PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 "
@@ -36,14 +39,14 @@ public class AddCommand extends Command {
+ PREFIX_TAG + "owesMoney";
public static final String MESSAGE_SUCCESS = "New person added: %1$s";
- public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book";
+ public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the Med Logger";
private final Person toAdd;
/**
- * Creates an AddCommand to add the specified {@code Person}
+ * Creates an AddPersonCommand to add the specified {@code Person}
*/
- public AddCommand(Person person) {
+ public AddPersonCommand(Person person) {
requireNonNull(person);
toAdd = person;
}
@@ -67,12 +70,12 @@ public boolean equals(Object other) {
}
// instanceof handles nulls
- if (!(other instanceof AddCommand)) {
+ if (!(other instanceof AddPersonCommand)) {
return false;
}
- AddCommand otherAddCommand = (AddCommand) other;
- return toAdd.equals(otherAddCommand.toAdd);
+ AddPersonCommand otherAddPersonCommand = (AddPersonCommand) other;
+ return toAdd.equals(otherAddPersonCommand.toAdd);
}
@Override
diff --git a/src/main/java/seedu/address/logic/commands/AddVisitCommand.java b/src/main/java/seedu/address/logic/commands/AddVisitCommand.java
new file mode 100644
index 00000000000..4aed038218e
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/AddVisitCommand.java
@@ -0,0 +1,87 @@
+package seedu.address.logic.commands;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DIAGNOSIS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_FOLLOWUP;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_MEDICATION;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_SYMPTOM;
+
+import java.util.Optional;
+
+import seedu.address.logic.Messages;
+import seedu.address.logic.commands.exceptions.CommandException;
+import seedu.address.model.Model;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Visit;
+
+/**
+ * Adds a visit to the Med Logger.
+ */
+public class AddVisitCommand extends Command {
+ public static final String COMMAND_WORD = "visit";
+
+ public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a visit to MedLogger.\n"
+ + "Parameters: "
+ + PREFIX_NRIC + "NRIC "
+ + "[" + PREFIX_DATE + "DATE_TIME] "
+ + PREFIX_REMARK + "REMARK "
+ + PREFIX_SYMPTOM + "SYMPTOM "
+ + PREFIX_DIAGNOSIS + "DIAGNOSIS "
+ + PREFIX_MEDICATION + "MEDICATION "
+ + PREFIX_FOLLOWUP + "FOLLOWUP\n"
+ + "Example: " + COMMAND_WORD + " "
+ + PREFIX_NRIC + "S1234567A "
+ + PREFIX_REMARK + "Headache "
+ + PREFIX_SYMPTOM + "Headache "
+ + PREFIX_DIAGNOSIS + "Migraine "
+ + PREFIX_MEDICATION + "Panadol "
+ + PREFIX_FOLLOWUP + "In 1 week";
+
+ public static final String MESSAGE_SUCCESS = "New visit recorded: %1$s";
+ public static final String MESSAGE_DUPLICATE_VISIT = "This visit already exists in the MedLogger";
+ public static final String MESSAGE_NO_PERSON_FOR_VISIT = "The person in this visit does not exist in the MedLogger";
+
+ private Visit visit;
+
+ /**
+ * Creates an AddVisitCommand to add the specified {@code Visit}
+ */
+ public AddVisitCommand(Visit visit) {
+ requireNonNull(visit);
+ this.visit = visit;
+ }
+
+ @Override
+ public CommandResult execute(Model model) throws CommandException {
+ requireNonNull(model);
+
+ Optional optionalPerson = model.getPersonByNric(visit.getNric());
+
+ if (optionalPerson.isEmpty()) {
+ throw new CommandException(MESSAGE_NO_PERSON_FOR_VISIT);
+ }
+
+ Person person = optionalPerson.get();
+
+ // Replace the visit's person with the actual one from model
+ this.visit = new Visit(
+ person,
+ visit.getDateTime(),
+ visit.getRemark(),
+ visit.getSymptom(),
+ visit.getDiagnosis(),
+ visit.getMedication(),
+ visit.getFollowUp()
+ );
+
+ if (model.hasVisit(visit)) {
+ throw new CommandException(MESSAGE_DUPLICATE_VISIT);
+ }
+
+ model.addVisit(visit);
+ return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(visit)));
+ }
+}
diff --git a/src/main/java/seedu/address/logic/commands/ClearCommand.java b/src/main/java/seedu/address/logic/commands/ClearCommand.java
index 9c86b1fa6e4..c46d1d9b3c9 100644
--- a/src/main/java/seedu/address/logic/commands/ClearCommand.java
+++ b/src/main/java/seedu/address/logic/commands/ClearCommand.java
@@ -2,22 +2,22 @@
import static java.util.Objects.requireNonNull;
-import seedu.address.model.AddressBook;
+import seedu.address.model.MedLogger;
import seedu.address.model.Model;
/**
- * Clears the address book.
+ * Clears the Med Logger.
*/
public class ClearCommand extends Command {
public static final String COMMAND_WORD = "clear";
- public static final String MESSAGE_SUCCESS = "Address book has been cleared!";
+ public static final String MESSAGE_SUCCESS = "Med Logger has been cleared!";
@Override
public CommandResult execute(Model model) {
requireNonNull(model);
- model.setAddressBook(new AddressBook());
+ model.setMedLogger(new MedLogger());
return new CommandResult(MESSAGE_SUCCESS);
}
}
diff --git a/src/main/java/seedu/address/logic/commands/ClearVisitsCommand.java b/src/main/java/seedu/address/logic/commands/ClearVisitsCommand.java
new file mode 100644
index 00000000000..ade2c58432f
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/ClearVisitsCommand.java
@@ -0,0 +1,21 @@
+package seedu.address.logic.commands;
+
+import static java.util.Objects.requireNonNull;
+
+import seedu.address.model.Model;
+
+/**
+ * Clears the VisitListPanel display by removing all visits from the filtered list.
+ */
+public class ClearVisitsCommand extends Command {
+
+ public static final String COMMAND_WORD = "clearvisits";
+ public static final String MESSAGE_SUCCESS = "Cleared all visits from the panel.";
+
+ @Override
+ public CommandResult execute(Model model) {
+ requireNonNull(model);
+ model.clearVisits();
+ return new CommandResult(MESSAGE_SUCCESS);
+ }
+}
diff --git a/src/main/java/seedu/address/logic/commands/DeleteCommand.java b/src/main/java/seedu/address/logic/commands/DeleteCommand.java
index 1135ac19b74..51fee54169f 100644
--- a/src/main/java/seedu/address/logic/commands/DeleteCommand.java
+++ b/src/main/java/seedu/address/logic/commands/DeleteCommand.java
@@ -12,7 +12,7 @@
import seedu.address.model.person.Person;
/**
- * Deletes a person identified using it's displayed index from the address book.
+ * Deletes a person identified using it's displayed index from the Med Logger.
*/
public class DeleteCommand extends Command {
diff --git a/src/main/java/seedu/address/logic/commands/DeleteVisitCommand.java b/src/main/java/seedu/address/logic/commands/DeleteVisitCommand.java
new file mode 100644
index 00000000000..e5cd0fe6113
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/DeleteVisitCommand.java
@@ -0,0 +1,66 @@
+package seedu.address.logic.commands;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.List;
+
+import seedu.address.commons.core.index.Index;
+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.person.Visit;
+
+/**
+ * Deletes a visit identified using it's displayed index from the Med Logger.
+ */
+public class DeleteVisitCommand extends Command {
+ public static final String COMMAND_WORD = "deletevisit";
+ public static final String MESSAGE_USAGE = COMMAND_WORD
+ + ": Deletes the visit identified by the index number used in the displayed visit list.\n"
+ + "Parameters: INDEX (must be a positive integer)\n"
+ + "Example: " + COMMAND_WORD + " 1";
+ public static final String MESSAGE_DELETE_VISIT_SUCCESS = "Deleted Visit: %1$s";
+
+ private final Index targetIndex;
+
+ public DeleteVisitCommand(Index targetIndex) {
+ this.targetIndex = targetIndex;
+ }
+
+ @Override
+ public CommandResult execute(Model model) throws CommandException {
+ requireNonNull(model);
+ List lastShownList = model.getFilteredVisitList();
+
+ if (targetIndex.getZeroBased() >= lastShownList.size()) {
+ throw new CommandException(Messages.MESSAGE_INVALID_VISIT_DISPLAYED_INDEX);
+ }
+ Visit visitToDelete = lastShownList.get(targetIndex.getZeroBased());
+ model.deleteVisit(visitToDelete);
+ return new CommandResult(String.format(MESSAGE_DELETE_VISIT_SUCCESS, Messages.format(visitToDelete)));
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof DeleteVisitCommand)) {
+ return false;
+ }
+
+ DeleteVisitCommand otherDeleteVisitCommand = (DeleteVisitCommand) other;
+ return targetIndex.equals(otherDeleteVisitCommand.targetIndex);
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .add("targetIndex", targetIndex)
+ .toString();
+ }
+
+}
diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditPersonCommand.java
similarity index 84%
rename from src/main/java/seedu/address/logic/commands/EditCommand.java
rename to src/main/java/seedu/address/logic/commands/EditPersonCommand.java
index 4b581c7331e..c2a24b34120 100644
--- a/src/main/java/seedu/address/logic/commands/EditCommand.java
+++ b/src/main/java/seedu/address/logic/commands/EditPersonCommand.java
@@ -4,6 +4,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
@@ -24,22 +25,26 @@
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
+
/**
- * Edits the details of an existing person in the address book.
+ * Edits the details of an existing person in the Med Logger.
*/
-public class EditCommand extends Command {
+public class EditPersonCommand extends Command {
- public static final String COMMAND_WORD = "edit";
+ public static final String COMMAND_WORD = "editperson";
public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the person identified "
+ "by the index number used in the displayed person list. "
+ "Existing values will be overwritten by the input values.\n"
+ "Parameters: INDEX (must be a positive integer) "
+ "[" + PREFIX_NAME + "NAME] "
+ + "[" + PREFIX_NRIC + "Nric] "
+ "[" + PREFIX_PHONE + "PHONE] "
+ "[" + PREFIX_EMAIL + "EMAIL] "
+ "[" + PREFIX_ADDRESS + "ADDRESS] "
@@ -50,7 +55,7 @@ public class EditCommand extends Command {
public static final String MESSAGE_EDIT_PERSON_SUCCESS = "Edited Person: %1$s";
public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided.";
- public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book.";
+ public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the Med Logger.";
private final Index index;
private final EditPersonDescriptor editPersonDescriptor;
@@ -59,7 +64,7 @@ public class EditCommand extends Command {
* @param index of the person in the filtered person list to edit
* @param editPersonDescriptor details to edit the person with
*/
- public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {
+ public EditPersonCommand(Index index, EditPersonDescriptor editPersonDescriptor) {
requireNonNull(index);
requireNonNull(editPersonDescriptor);
@@ -96,12 +101,15 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript
assert personToEdit != null;
Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName());
+ Nric updatedNric = editPersonDescriptor.getNric().orElse(personToEdit.getNric());
Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());
Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());
Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
+ Remark updatedRemark = personToEdit.getRemark();
Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());
- return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);
+ return new Person(updatedName, updatedNric, updatedPhone, updatedEmail, updatedAddress,
+ updatedRemark, updatedTags);
}
@Override
@@ -111,13 +119,13 @@ public boolean equals(Object other) {
}
// instanceof handles nulls
- if (!(other instanceof EditCommand)) {
+ if (!(other instanceof EditPersonCommand)) {
return false;
}
- EditCommand otherEditCommand = (EditCommand) other;
- return index.equals(otherEditCommand.index)
- && editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);
+ EditPersonCommand otherEditPersonCommand = (EditPersonCommand) other;
+ return index.equals(otherEditPersonCommand.index)
+ && editPersonDescriptor.equals(otherEditPersonCommand.editPersonDescriptor);
}
@Override
@@ -134,6 +142,7 @@ public String toString() {
*/
public static class EditPersonDescriptor {
private Name name;
+ private Nric nric;
private Phone phone;
private Email email;
private Address address;
@@ -147,6 +156,7 @@ public EditPersonDescriptor() {}
*/
public EditPersonDescriptor(EditPersonDescriptor toCopy) {
setName(toCopy.name);
+ setNric(toCopy.nric);
setPhone(toCopy.phone);
setEmail(toCopy.email);
setAddress(toCopy.address);
@@ -157,7 +167,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) {
* Returns true if at least one field is edited.
*/
public boolean isAnyFieldEdited() {
- return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);
+ return CollectionUtil.isAnyNonNull(name, nric, phone, email, address, tags);
}
public void setName(Name name) {
@@ -168,6 +178,14 @@ public Optional getName() {
return Optional.ofNullable(name);
}
+ public void setNric(Nric nric) {
+ this.nric = nric;
+ }
+
+ public Optional getNric() {
+ return Optional.ofNullable(nric);
+ }
+
public void setPhone(Phone phone) {
this.phone = phone;
}
@@ -222,6 +240,7 @@ public boolean equals(Object other) {
EditPersonDescriptor otherEditPersonDescriptor = (EditPersonDescriptor) other;
return Objects.equals(name, otherEditPersonDescriptor.name)
+ && Objects.equals(nric, otherEditPersonDescriptor.nric)
&& Objects.equals(phone, otherEditPersonDescriptor.phone)
&& Objects.equals(email, otherEditPersonDescriptor.email)
&& Objects.equals(address, otherEditPersonDescriptor.address)
@@ -232,6 +251,7 @@ public boolean equals(Object other) {
public String toString() {
return new ToStringBuilder(this)
.add("name", name)
+ .add("NRIC", nric)
.add("phone", phone)
.add("email", email)
.add("address", address)
diff --git a/src/main/java/seedu/address/logic/commands/EditVisitCommand.java b/src/main/java/seedu/address/logic/commands/EditVisitCommand.java
new file mode 100644
index 00000000000..b41acf528a2
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/EditVisitCommand.java
@@ -0,0 +1,271 @@
+package seedu.address.logic.commands;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DIAGNOSIS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_FOLLOWUP;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_MEDICATION;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_SYMPTOM;
+import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
+import static seedu.address.model.Model.PREDICATE_SHOW_ALL_VISITS;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.commons.util.CollectionUtil;
+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.person.DateTime;
+import seedu.address.model.person.Diagnosis;
+import seedu.address.model.person.FollowUp;
+import seedu.address.model.person.Medication;
+import seedu.address.model.person.Nric;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Remark;
+import seedu.address.model.person.Symptom;
+import seedu.address.model.person.Visit;
+
+
+/**
+ * Edits the details of an existing visit in the Med Logger.
+ */
+public class EditVisitCommand extends Command {
+
+ public static final String COMMAND_WORD = "editvisit";
+
+ public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the visit identified "
+ + "by the index number used in the displayed visit list. "
+ + "Existing values will be overwritten by the input values.\n"
+ + "Parameters: INDEX (must be a positive integer) "
+ + "[" + PREFIX_NRIC + "NRIC] "
+ + "[" + PREFIX_DATE + "DATE] "
+ + "[" + PREFIX_REMARK + "REMARK] "
+ + "[" + PREFIX_SYMPTOM + "SYMPTOM] "
+ + "[" + PREFIX_DIAGNOSIS + "DIAGNOSIS] "
+ + "[" + PREFIX_MEDICATION + "MEDICATION] "
+ + "[" + PREFIX_FOLLOWUP + "FOLLOWUP] \n"
+ + "Example: " + COMMAND_WORD + " 1 "
+ + PREFIX_DATE + "2025-04-04 15:00 "
+ + PREFIX_REMARK + "Improved "
+ + PREFIX_SYMPTOM + "Fever "
+ + PREFIX_DIAGNOSIS + "Flu "
+ + PREFIX_MEDICATION + "Paracetamol "
+ + PREFIX_FOLLOWUP + "1 week";
+
+ public static final String MESSAGE_EDIT_VISIT_SUCCESS = "Edited Visit: %1$s";
+ public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided.";
+ public static final String MESSAGE_DUPLICATE_VISIT = "This visit already exists in the Med Logger.";
+ public static final String MESSAGE_NO_PERSON_FOR_VISIT = "The person in the edited "
+ + "visit does not exist in the MedLogger";
+
+
+ private final Index index;
+ private final EditVisitDescriptor editVisitDescriptor;
+
+ /**
+ * @param index of the visit in the filtered visit list to edit
+ * @param editVisitDescriptor details to edit the visit with
+ */
+ public EditVisitCommand(Index index, EditVisitDescriptor editVisitDescriptor) {
+ requireNonNull(index);
+ requireNonNull(editVisitDescriptor);
+
+ this.index = index;
+ this.editVisitDescriptor = new EditVisitDescriptor(editVisitDescriptor);
+ }
+
+ @Override
+ public CommandResult execute(Model model) throws CommandException {
+ requireNonNull(model);
+ List lastShownList = model.getFilteredVisitList();
+
+ if (index.getZeroBased() >= lastShownList.size()) {
+ throw new CommandException(Messages.MESSAGE_INVALID_VISIT_DISPLAYED_INDEX);
+ }
+
+ Visit visitToEdit = lastShownList.get(index.getZeroBased());
+ Person person = visitToEdit.getPerson();
+
+ if (editVisitDescriptor.getNric().isPresent()) {
+ if (model.getPersonByNric(editVisitDescriptor.getNric().get()).isEmpty()) {
+ throw new CommandException(MESSAGE_NO_PERSON_FOR_VISIT);
+ }
+ person = model.getPersonByNric(editVisitDescriptor.getNric().get()).get();
+ }
+
+ Visit editedVisit = createEditedVisit(person, visitToEdit, editVisitDescriptor);
+
+ if (!visitToEdit.equals(editedVisit) && model.hasVisit(editedVisit)) {
+ throw new CommandException(MESSAGE_DUPLICATE_VISIT);
+ }
+
+ model.setVisit(visitToEdit, editedVisit);
+ model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
+ model.updateFilteredVisitList(PREDICATE_SHOW_ALL_VISITS);
+ return new CommandResult(String.format(MESSAGE_EDIT_VISIT_SUCCESS, Messages.format(editedVisit)));
+ }
+
+ /**
+ * Creates and returns a {@code Visit} with the details of {@code visitToEdit}
+ * edited with {@code editVisitDescriptor}.
+ */
+ private static Visit createEditedVisit(Person person, Visit visitToEdit,
+ EditVisitDescriptor editVisitDescriptor) {
+
+ assert visitToEdit != null;
+ DateTime updatedDateTime = editVisitDescriptor.getDateTime().orElse(visitToEdit.getDateTime());
+ Remark updatedRemark = editVisitDescriptor.getRemark().orElse(visitToEdit.getRemark());
+ Symptom updatedSymptom = editVisitDescriptor.getSymptom().orElse(visitToEdit.getSymptom());
+ Diagnosis updatedDiagnosis = editVisitDescriptor.getDiagnosis().orElse(visitToEdit.getDiagnosis());
+ Medication updatedMedication = editVisitDescriptor.getMedication().orElse(visitToEdit.getMedication());
+ FollowUp updatedFollowUp = editVisitDescriptor.getFollowUp().orElse(visitToEdit.getFollowUp());
+ return new Visit(person, updatedDateTime, updatedRemark, updatedSymptom,
+ updatedDiagnosis, updatedMedication, updatedFollowUp);
+ }
+
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof EditPersonCommand)) {
+ return false;
+ }
+
+ EditVisitCommand otherEditVisitCommand = (EditVisitCommand) other;
+ return index.equals(otherEditVisitCommand.index)
+ && editVisitDescriptor.equals(otherEditVisitCommand.editVisitDescriptor);
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .add("index", index)
+ .add("editVisitDescriptor", editVisitDescriptor)
+ .toString();
+ }
+
+ /**
+ * Stores the details to edit the person with. Each non-empty field value will replace the
+ * corresponding field value of the person.
+ */
+ public static class EditVisitDescriptor {
+ private Nric nric;
+ private DateTime dateTime;
+ private Remark remark;
+ private Symptom symptom;
+ private Diagnosis diagnosis;
+ private Medication medication;
+ private FollowUp followUp;
+
+ public EditVisitDescriptor() {}
+
+ /**
+ * Copy constructor.
+ */
+ public EditVisitDescriptor(EditVisitDescriptor toCopy) {
+ setNric(toCopy.nric);
+ setDateTime(toCopy.dateTime);
+ setRemark(toCopy.remark);
+ setSymptom(toCopy.symptom);
+ setDiagnosis(toCopy.diagnosis);
+ setMedication(toCopy.medication);
+ setFollowUp(toCopy.followUp);
+ }
+
+ /**
+ * Returns true if at least one field is edited.
+ */
+ public boolean isAnyFieldEdited() {
+ return CollectionUtil.isAnyNonNull(nric, dateTime, remark, symptom, diagnosis, medication, followUp);
+ }
+
+ public void setNric(Nric nric) {
+ this.nric = nric;
+ }
+
+ public Optional getNric() {
+ return Optional.ofNullable(nric);
+ }
+
+ public void setDateTime(DateTime dateTime) {
+ this.dateTime = dateTime;
+ }
+
+ public Optional getDateTime() {
+ return Optional.ofNullable(dateTime);
+ }
+
+ public void setRemark(Remark remark) {
+ this.remark = remark;
+ }
+
+ public Optional getRemark() {
+ return Optional.ofNullable(remark);
+ }
+
+ // Setters and Getters
+ public void setSymptom(Symptom symptom) {
+ this.symptom = symptom;
+ }
+ public Optional getSymptom() {
+ return Optional.ofNullable(symptom);
+ }
+
+ public void setDiagnosis(Diagnosis diagnosis) {
+ this.diagnosis = diagnosis;
+ }
+ public Optional getDiagnosis() {
+ return Optional.ofNullable(diagnosis);
+ }
+
+ public void setMedication(Medication medication) {
+ this.medication = medication;
+ }
+ public Optional getMedication() {
+ return Optional.ofNullable(medication);
+ }
+
+ public void setFollowUp(FollowUp followUp) {
+ this.followUp = followUp;
+ }
+ public Optional getFollowUp() {
+ return Optional.ofNullable(followUp);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof EditVisitDescriptor)) {
+ return false;
+ }
+
+ EditVisitDescriptor otherEditVisitDescriptor = (EditVisitDescriptor) other;
+ return Objects.equals(nric, otherEditVisitDescriptor.nric)
+ && Objects.equals(dateTime, otherEditVisitDescriptor.dateTime)
+ && Objects.equals(remark, otherEditVisitDescriptor.remark);
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .add("NRIC", nric)
+ .add("dateTime", dateTime)
+ .add("remark", remark)
+ .toString();
+ }
+ }
+}
diff --git a/src/main/java/seedu/address/logic/commands/ExportCommand.java b/src/main/java/seedu/address/logic/commands/ExportCommand.java
new file mode 100644
index 00000000000..d594fb5fc1b
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/ExportCommand.java
@@ -0,0 +1,71 @@
+package seedu.address.logic.commands;
+
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+import seedu.address.commons.util.FileUtil;
+import seedu.address.logic.commands.exceptions.CommandException;
+import seedu.address.model.Model;
+
+/**
+ * Exports data to a file in CSV or JSON format.
+ */
+public class ExportCommand extends Command {
+
+ public static final String COMMAND_WORD = "export";
+
+ public static final String MESSAGE_SUCCESS_JSON = "Data export successfully to json file";
+
+ public static final String MESSAGE_SUCCESS_CSV = "Data export successfully to csv file";
+
+ public static final String MESSAGE_USAGE = "export csv/json";
+
+ public static final String DEFAULT_PREFIX = "exported_data.";
+
+ public static final String CSV_TYPE = "csv";
+
+ public static final String JSON_TYPE = "json";
+
+ private String fileType;
+
+ public ExportCommand(String fileType) {
+ this.fileType = fileType;
+ }
+
+ @Override
+ public CommandResult execute(Model model) throws CommandException {
+
+ // Validate filetype: Either csv or json
+ if (!fileType.equals(CSV_TYPE) && !fileType.equals(JSON_TYPE)) {
+ throw new CommandException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ExportCommand.MESSAGE_USAGE));
+ }
+
+ // Initialize variables
+ Path sourcePath = model.getMedLoggerFilePath();
+ String defaultName = DEFAULT_PREFIX + fileType.toLowerCase();
+
+ try {
+ FileUtil.saveWithDialog(sourcePath, this.fileType, defaultName);
+ return new CommandResult(fileType.equals(CSV_TYPE) ? MESSAGE_SUCCESS_CSV : MESSAGE_SUCCESS_JSON);
+ } catch (IOException e) {
+ throw new CommandException(String.format(e.getMessage()));
+ }
+
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ if (!(other instanceof ExportCommand e)) {
+ return false;
+ }
+
+ return fileType.equals(e.fileType);
+ }
+
+}
diff --git a/src/main/java/seedu/address/logic/commands/FindCommand.java b/src/main/java/seedu/address/logic/commands/FindCommand.java
index 72b9eddd3a7..aaad01a8af6 100644
--- a/src/main/java/seedu/address/logic/commands/FindCommand.java
+++ b/src/main/java/seedu/address/logic/commands/FindCommand.java
@@ -8,7 +8,7 @@
import seedu.address.model.person.NameContainsKeywordsPredicate;
/**
- * Finds and lists all persons in address book whose name contains any of the argument keywords.
+ * Finds and lists all persons in Med Logger whose name contains any of the argument keywords.
* Keyword matching is case insensitive.
*/
public class FindCommand extends Command {
diff --git a/src/main/java/seedu/address/logic/commands/ListCommand.java b/src/main/java/seedu/address/logic/commands/ListCommand.java
index 84be6ad2596..f58b0e53602 100644
--- a/src/main/java/seedu/address/logic/commands/ListCommand.java
+++ b/src/main/java/seedu/address/logic/commands/ListCommand.java
@@ -6,7 +6,7 @@
import seedu.address.model.Model;
/**
- * Lists all persons in the address book to the user.
+ * Lists all persons in the Med Logger to the user.
*/
public class ListCommand extends Command {
@@ -14,11 +14,30 @@ public class ListCommand extends Command {
public static final String MESSAGE_SUCCESS = "Listed all persons";
+ public static final String MESSAGE_USAGE = "list l/LIMIT";
+
+ public static final String MESSAGE_LIMIT_CONSTRAINTS = "Limit must be non-negative integer";
+
+ private Integer limit;
+
+ public ListCommand() {};
+
+ public ListCommand(int limit) {
+ this.limit = limit;
+ }
@Override
public CommandResult execute(Model model) {
requireNonNull(model);
- model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
- return new CommandResult(MESSAGE_SUCCESS);
+
+ if (this.limit == null) {
+ model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
+ return new CommandResult(MESSAGE_SUCCESS);
+ } else {
+ model.updateSubFilteredPersonList(this.limit);
+ int numOfPersons = this.limit > model.size() ? model.size() : this.limit;
+ return new CommandResult("Listed " + numOfPersons + " persons");
+ }
+
}
}
diff --git a/src/main/java/seedu/address/logic/commands/ListVisitsCommand.java b/src/main/java/seedu/address/logic/commands/ListVisitsCommand.java
new file mode 100644
index 00000000000..f8ad53bbd6c
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/ListVisitsCommand.java
@@ -0,0 +1,123 @@
+package seedu.address.logic.commands;
+
+import static java.util.Objects.requireNonNull;
+
+import java.time.LocalDate;
+import java.util.function.Predicate;
+
+import seedu.address.model.Model;
+import seedu.address.model.person.Diagnosis;
+import seedu.address.model.person.Medication;
+import seedu.address.model.person.Nric;
+import seedu.address.model.person.Symptom;
+import seedu.address.model.person.Visit;
+
+/**
+ * Lists all visits in the Med Logger to the user.
+ */
+public class ListVisitsCommand extends Command {
+
+ public static final String COMMAND_WORD = "listvisits";
+ public static final String MESSAGE_SUCCESS_FORMAT = "Listed %d visit%s.";
+ public static final String MESSAGE_USAGE = "listvisits: Lists visits with optional filters.\n"
+ + "Parameters: [i/NRIC] [l/LIMIT] [from/DATE] [to/DATE] [today/] "
+ + "[sym/SYMPTOM] [diag/DIAGNOSIS] [med/MEDICATION]\n"
+ + "Example: listvisits i/S1234567A from/2023-01-01 to/2023-12-31 diagnosis/flu";
+
+ private final Nric nric;
+ private final Integer limit;
+ private final LocalDate fromDate;
+ private final LocalDate toDate;
+ private final boolean isToday;
+ private final Symptom symptom;
+ private final Diagnosis diagnosis;
+ private final Medication medication;
+
+
+ /**
+ * Creates a ListVisitsCommand to list all visits.
+ * thus no NRIC or limit is provided.
+ */
+ public ListVisitsCommand() {
+ this.nric = null;
+ this.limit = null;
+ this.fromDate = null;
+ this.toDate = null;
+ this.isToday = false;
+ this.symptom = null;
+ this.diagnosis = null;
+ this.medication = null;
+ }
+
+ /**
+ * Creates a ListVisitsCommand to list only visits
+ * with the specified NRIC and limit.
+ * Both parameters are optional.
+ *
+ * @param nric the NRIC of the person whose visits to list
+ * @param limit the maximum number of visits to list
+ */
+ public ListVisitsCommand(Nric nric, Integer limit, LocalDate fromDate, LocalDate toDate,
+ boolean isToday, Symptom symptom, Diagnosis diagnosis, Medication medication) {
+ this.nric = nric;
+ this.limit = limit;
+ this.fromDate = fromDate;
+ this.toDate = toDate;
+ this.isToday = isToday;
+ this.symptom = symptom;
+ this.diagnosis = diagnosis;
+ this.medication = medication;
+ }
+
+ @Override
+ public CommandResult execute(Model model) {
+ requireNonNull(model);
+
+ Predicate predicate = v -> true;
+
+ if (nric != null) {
+ predicate = predicate.and(visit -> visit.getNric().equals(nric));
+ }
+
+ if (symptom != null) {
+ predicate = predicate.and(visit ->
+ visit.getSymptom().value.toLowerCase().contains(symptom.toLowerCase()));
+ }
+
+ if (diagnosis != null) {
+ predicate = predicate.and(visit ->
+ visit.getDiagnosis().value.toLowerCase().contains(diagnosis.toLowerCase()));
+ }
+
+ if (medication != null) {
+ predicate = predicate.and(visit ->
+ visit.getMedication().value.toLowerCase().contains(medication.toLowerCase()));
+ }
+
+ if (isToday) {
+ LocalDate today = LocalDate.now();
+ predicate = predicate.and(visit ->
+ visit.getDateTime().toLocalDateTime().toLocalDate().isEqual(today));
+ } else {
+ if (fromDate != null) {
+ predicate = predicate.and(visit ->
+ !visit.getDateTime().toLocalDateTime().toLocalDate().isBefore(fromDate));
+ }
+ if (toDate != null) {
+ predicate = predicate.and(visit ->
+ !visit.getDateTime().toLocalDateTime().toLocalDate().isAfter(toDate));
+ }
+ }
+
+ model.updateFilteredVisitList(predicate);
+
+ // Apply limit if provided
+ if (limit != null) {
+ model.updateSubFilteredVisitList(limit); // assumes sub-listing is after main filtering
+ return new CommandResult("Listed " + Math.min(limit, model.getFilteredVisitList().size()) + " visits");
+ }
+
+ int size = model.getFilteredVisitList().size();
+ return new CommandResult(String.format(MESSAGE_SUCCESS_FORMAT, size, size == 1 ? "" : "s"));
+ }
+}
diff --git a/src/main/java/seedu/address/logic/commands/RemarkCommand.java b/src/main/java/seedu/address/logic/commands/RemarkCommand.java
new file mode 100644
index 00000000000..d29bf736b3a
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/RemarkCommand.java
@@ -0,0 +1,94 @@
+package seedu.address.logic.commands;
+
+import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
+
+import java.util.List;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.Messages;
+import seedu.address.logic.commands.exceptions.CommandException;
+import seedu.address.model.Model;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Remark;
+
+/**
+ * Add remark (additional text) at the end for each user.
+ */
+public class RemarkCommand extends Command {
+
+ public static final String COMMAND_WORD = "remark";
+
+ public static final String MESSAGE_USAGE = COMMAND_WORD
+ + ": Edits the remark of the person identified "
+ + "by the index number used in the last person listing. "
+ + "Existing remark will be overwritten by the input.\n"
+ + "Parameters: INDEX (must be a positive integer) "
+ + "r/ [REMARK]\n"
+ + "Example: " + COMMAND_WORD + " 1 "
+ + "r/ Likes to swim.";
+
+ public static final String MESSAGE_NOT_IMPLEMENTED_YET =
+ "Remark command not implemented yet";
+
+ public static final String MESSAGE_ARGUMENTS = "Index: %1$d, Remark: %2$s";
+
+ public static final String MESSAGE_ADD_REMARK_SUCCESS = "Added remark to Person: %1$s";
+ public static final String MESSAGE_DELETE_REMARK_SUCCESS = "Removed remark from Person: %1$s";
+
+ private final Index index;
+ private final Remark remark;
+
+ /**
+ * Creates a RemarkCommand to add or update a remark for a specific person.
+ *
+ * @param index The index of the person in the displayed person list.
+ * @param remark The remark to be added or updated.
+ */
+ public RemarkCommand(Index index, Remark remark) {
+ requireAllNonNull(index, remark);
+ this.index = index;
+ this.remark = remark;
+ }
+
+ @Override
+ public CommandResult execute(Model model) throws CommandException {
+ List lastShownList = model.getFilteredPersonList();
+
+ if (index.getZeroBased() >= lastShownList.size()) {
+ throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
+ }
+
+ Person personToEdit = lastShownList.get(index.getZeroBased());
+ Person editedPerson = new Person(personToEdit.getName(), personToEdit.getNric(), personToEdit.getPhone(),
+ personToEdit.getEmail(), personToEdit.getAddress(), remark, personToEdit.getTags());
+
+ model.setPerson(personToEdit, editedPerson);
+ model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
+
+ return new CommandResult(generateSuccessMessage(editedPerson));
+ }
+
+ /**
+ * Generates a command execution success message based on whether the remark is added to or removed from
+ * {@code personToEdit}.
+ */
+ private String generateSuccessMessage(Person personToEdit) {
+ String message = !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;
+ return String.format(message, Messages.format(personToEdit));
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ if (!(other instanceof RemarkCommand e)) {
+ return false;
+ }
+
+ return index.equals(e.index) && remark.equals(e.remark);
+ }
+
+}
diff --git a/src/main/java/seedu/address/logic/commands/SortVisitsCommand.java b/src/main/java/seedu/address/logic/commands/SortVisitsCommand.java
new file mode 100644
index 00000000000..63eff2d3fbe
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/SortVisitsCommand.java
@@ -0,0 +1,40 @@
+package seedu.address.logic.commands;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Comparator;
+
+import seedu.address.model.Model;
+import seedu.address.model.person.Visit;
+
+/**
+ * Sorts the currently visible visit list by visit dateTime.
+ */
+public class SortVisitsCommand extends Command {
+
+ public static final String COMMAND_WORD = "sortvisits";
+ public static final String MESSAGE_SUCCESS_ASC = "Sorted visits by date and time (ascending).";
+ public static final String MESSAGE_SUCCESS_DESC = "Sorted visits by date and time (descending).";
+
+ private final boolean isDescending;
+
+ public SortVisitsCommand(boolean isDescending) {
+ this.isDescending = isDescending;
+ }
+
+ @Override
+ public CommandResult execute(Model model) {
+ requireNonNull(model);
+
+ Comparator comparator = Comparator.comparing((Visit v) -> v.getDateTime().toLocalDateTime());
+ if (isDescending) {
+ comparator = comparator.reversed();
+ }
+
+ model.sortFilteredVisitList(comparator);
+
+ return new CommandResult(isDescending ? MESSAGE_SUCCESS_DESC : MESSAGE_SUCCESS_ASC);
+ }
+}
+
+
diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddPersonCommandParser.java
similarity index 67%
rename from src/main/java/seedu/address/logic/parser/AddCommandParser.java
rename to src/main/java/seedu/address/logic/parser/AddPersonCommandParser.java
index 4ff1a97ed77..1b6eb2d364c 100644
--- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddPersonCommandParser.java
@@ -4,50 +4,56 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import java.util.Set;
import java.util.stream.Stream;
-import seedu.address.logic.commands.AddCommand;
+import seedu.address.logic.commands.AddPersonCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
/**
- * Parses input arguments and creates a new AddCommand object
+ * Parses input arguments and creates a new AddPersonCommand object
*/
-public class AddCommandParser implements Parser {
+public class AddPersonCommandParser implements Parser {
/**
- * Parses the given {@code String} of arguments in the context of the AddCommand
- * and returns an AddCommand object for execution.
+ * Parses the given {@code String} of arguments in the context of the AddPersonCommand
+ * and returns an AddPersonCommand object for execution.
* @throws ParseException if the user input does not conform the expected format
*/
- public AddCommand parse(String args) throws ParseException {
+ public AddPersonCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
- ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);
+ ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_NRIC, PREFIX_PHONE, PREFIX_EMAIL,
+ PREFIX_ADDRESS, PREFIX_TAG);
- if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)
+ if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_NRIC, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)
|| !argMultimap.getPreamble().isEmpty()) {
- throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE));
}
- argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_NRIC, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);
Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());
+ Nric nric = ParserUtil.parseNric(argMultimap.getValue(PREFIX_NRIC).get());
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());
Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
+ Remark remark = new Remark("");
Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
- Person person = new Person(name, phone, email, address, tagList);
+ Person person = new Person(name, nric, phone, email, address, remark, tagList);
- return new AddCommand(person);
+ return new AddPersonCommand(person);
}
/**
diff --git a/src/main/java/seedu/address/logic/parser/AddVisitCommandParser.java b/src/main/java/seedu/address/logic/parser/AddVisitCommandParser.java
new file mode 100644
index 00000000000..d78d59ca9da
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/AddVisitCommandParser.java
@@ -0,0 +1,81 @@
+package seedu.address.logic.parser;
+
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DIAGNOSIS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_FOLLOWUP;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_MEDICATION;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_SYMPTOM;
+
+import java.util.stream.Stream;
+
+import seedu.address.logic.commands.AddVisitCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+import seedu.address.model.person.DateTime;
+import seedu.address.model.person.Diagnosis;
+import seedu.address.model.person.FollowUp;
+import seedu.address.model.person.Medication;
+import seedu.address.model.person.Nric;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Remark;
+import seedu.address.model.person.Symptom;
+import seedu.address.model.person.Visit;
+
+
+
+/**
+ * Parses input arguments and creates a new AddVisitCommand object
+ */
+public class AddVisitCommandParser implements Parser {
+ /**
+ * Parses the given {@code String} of arguments in the context of the AddVisitCommand
+ * and returns an AddVisitCommand object for execution.
+ * A dummy person instance is created to instantiate a visit
+ * @throws ParseException if the user input does not conform the expected format
+ */
+ public AddVisitCommand parse(String args) throws ParseException {
+ ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(
+ args,
+ PREFIX_NRIC, PREFIX_DATE, PREFIX_REMARK,
+ PREFIX_SYMPTOM, PREFIX_DIAGNOSIS, PREFIX_MEDICATION, PREFIX_FOLLOWUP
+ );
+
+ if (!arePrefixesPresent(argMultimap, PREFIX_NRIC)
+ || !argMultimap.getPreamble().isEmpty()) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddVisitCommand.MESSAGE_USAGE));
+ }
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NRIC, PREFIX_DATE,
+ PREFIX_REMARK, PREFIX_SYMPTOM, PREFIX_DIAGNOSIS, PREFIX_MEDICATION, PREFIX_FOLLOWUP);
+ Nric nric = ParserUtil.parseNric(argMultimap.getValue(PREFIX_NRIC).get());
+ Remark remark = new Remark(argMultimap.getValue(PREFIX_REMARK).orElse(""));
+
+ // Optional date
+ DateTime dateTime;
+ if (argMultimap.getValue(PREFIX_DATE).isPresent()) {
+ String dateInput = argMultimap.getValue(PREFIX_DATE).get();
+ if (!DateTime.isValidDate(dateInput)) {
+ throw new ParseException(DateTime.MESSAGE_CONSTRAINTS);
+ }
+ dateTime = new DateTime(dateInput);
+ } else {
+ dateTime = DateTime.now(); // Use current time if not specified
+ }
+
+ // Optional visit fields
+ Symptom symptom = new Symptom(argMultimap.getValue(PREFIX_SYMPTOM).orElse(""));
+ Diagnosis diagnosis = new Diagnosis(argMultimap.getValue(PREFIX_DIAGNOSIS).orElse(""));
+ Medication medication = new Medication(argMultimap.getValue(PREFIX_MEDICATION).orElse(""));
+ FollowUp followUp = new FollowUp(argMultimap.getValue(PREFIX_FOLLOWUP).orElse(""));
+
+ Person dummyPerson = Person.createDummyPerson(nric);
+
+ Visit visit = new Visit(dummyPerson, dateTime, remark, symptom, diagnosis, medication, followUp);
+ return new AddVisitCommand(visit);
+ }
+
+ private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {
+ return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent());
+ }
+}
diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java
index 75b1a9bf119..dabbf91659f 100644
--- a/src/main/java/seedu/address/logic/parser/CliSyntax.java
+++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java
@@ -7,9 +7,21 @@ public class CliSyntax {
/* Prefix definitions */
public static final Prefix PREFIX_NAME = new Prefix("n/");
+ public static final Prefix PREFIX_NRIC = new Prefix("i/");
public static final Prefix PREFIX_PHONE = new Prefix("p/");
public static final Prefix PREFIX_EMAIL = new Prefix("e/");
public static final Prefix PREFIX_ADDRESS = new Prefix("a/");
public static final Prefix PREFIX_TAG = new Prefix("t/");
+ public static final Prefix PREFIX_REMARK = new Prefix("r/");
+ public static final Prefix PREFIX_DATE = new Prefix("d/");
+ public static final Prefix PREFIX_LIMIT = new Prefix("l/");
+ /* For visits */
+ public static final Prefix PREFIX_SYMPTOM = new Prefix("sym/");
+ public static final Prefix PREFIX_DIAGNOSIS = new Prefix("diag/");
+ public static final Prefix PREFIX_MEDICATION = new Prefix("med/");
+ public static final Prefix PREFIX_FOLLOWUP = new Prefix("f/");
+ public static final Prefix PREFIX_FROM = new Prefix("from/");
+ public static final Prefix PREFIX_TO = new Prefix("to/");
+ public static final Prefix PREFIX_TODAY = new Prefix("today/");
}
diff --git a/src/main/java/seedu/address/logic/parser/DeleteVisitCommandParser.java b/src/main/java/seedu/address/logic/parser/DeleteVisitCommandParser.java
new file mode 100644
index 00000000000..048e47c90d9
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/DeleteVisitCommandParser.java
@@ -0,0 +1,29 @@
+package seedu.address.logic.parser;
+
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.commands.DeleteVisitCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+/**
+ * Parses input arguments and creates a new DeleteVisitCommand object
+ */
+public class DeleteVisitCommandParser implements Parser {
+
+ /**
+ * Parses the given {@code String} of arguments in the context of the DeleteVisitCommand
+ * and returns a DeleteVisitCommand object for execution.
+ * @throws ParseException if the user input does not conform the expected format
+ */
+ public DeleteVisitCommand parse(String args) throws ParseException {
+ try {
+ Index index = ParserUtil.parseIndex(args);
+ return new DeleteVisitCommand(index);
+ } catch (ParseException pe) {
+ throw new ParseException(
+ String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteVisitCommand.MESSAGE_USAGE), pe);
+ }
+ }
+
+}
diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditPersonCommandParser.java
similarity index 71%
rename from src/main/java/seedu/address/logic/parser/EditCommandParser.java
rename to src/main/java/seedu/address/logic/parser/EditPersonCommandParser.java
index 46b3309a78b..2618b8c9958 100644
--- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/EditPersonCommandParser.java
@@ -5,6 +5,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
@@ -14,41 +15,45 @@
import java.util.Set;
import seedu.address.commons.core.index.Index;
-import seedu.address.logic.commands.EditCommand;
-import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
+import seedu.address.logic.commands.EditPersonCommand;
+import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.tag.Tag;
/**
- * Parses input arguments and creates a new EditCommand object
+ * Parses input arguments and creates a new EditPersonCommand object
*/
-public class EditCommandParser implements Parser {
+public class EditPersonCommandParser implements Parser {
/**
- * Parses the given {@code String} of arguments in the context of the EditCommand
- * and returns an EditCommand object for execution.
+ * Parses the given {@code String} of arguments in the context of the EditPersonCommand
+ * and returns an EditPersonCommand object for execution.
* @throws ParseException if the user input does not conform the expected format
*/
- public EditCommand parse(String args) throws ParseException {
+ public EditPersonCommand parse(String args) throws ParseException {
requireNonNull(args);
- ArgumentMultimap argMultimap =
- ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);
+ ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_NRIC,
+ PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);
Index index;
try {
index = ParserUtil.parseIndex(argMultimap.getPreamble());
} catch (ParseException pe) {
- throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
+ EditPersonCommand.MESSAGE_USAGE), pe);
}
- argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_NRIC, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);
EditPersonDescriptor editPersonDescriptor = new EditPersonDescriptor();
if (argMultimap.getValue(PREFIX_NAME).isPresent()) {
editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));
}
+ if (argMultimap.getValue(PREFIX_NRIC).isPresent()) {
+ editPersonDescriptor.setNric(ParserUtil.parseNric(argMultimap.getValue(PREFIX_NRIC).get()));
+ }
if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {
editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));
}
@@ -61,10 +66,10 @@ public EditCommand parse(String args) throws ParseException {
parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);
if (!editPersonDescriptor.isAnyFieldEdited()) {
- throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);
+ throw new ParseException(EditPersonCommand.MESSAGE_NOT_EDITED);
}
- return new EditCommand(index, editPersonDescriptor);
+ return new EditPersonCommand(index, editPersonDescriptor);
}
/**
diff --git a/src/main/java/seedu/address/logic/parser/EditVisitCommandParser.java b/src/main/java/seedu/address/logic/parser/EditVisitCommandParser.java
new file mode 100644
index 00000000000..663f6d5df34
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/EditVisitCommandParser.java
@@ -0,0 +1,79 @@
+package seedu.address.logic.parser;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DIAGNOSIS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_FOLLOWUP;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_MEDICATION;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_SYMPTOM;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.commands.EditVisitCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+import seedu.address.model.person.Diagnosis;
+import seedu.address.model.person.FollowUp;
+import seedu.address.model.person.Medication;
+import seedu.address.model.person.Symptom;
+
+/**
+ * Parses input arguments and creates a new EditVisitCommand object
+ */
+public class EditVisitCommandParser implements Parser {
+
+ /**
+ * Parses the given {@code String} of arguments in the context of the EditVisitCommand
+ * and returns an EditVisitCommand object for execution.
+ * @throws ParseException if the user input does not conform the expected format
+ */
+ public EditVisitCommand parse(String args) throws ParseException {
+ requireNonNull(args);
+ ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args,
+ PREFIX_NRIC, PREFIX_DATE, PREFIX_REMARK,
+ PREFIX_SYMPTOM, PREFIX_DIAGNOSIS, PREFIX_MEDICATION, PREFIX_FOLLOWUP);
+
+ Index index;
+
+ try {
+ index = ParserUtil.parseIndex(argMultimap.getPreamble());
+ } catch (ParseException pe) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
+ EditVisitCommand.MESSAGE_USAGE), pe);
+ }
+
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NRIC, PREFIX_DATE, PREFIX_REMARK,
+ PREFIX_SYMPTOM, PREFIX_DIAGNOSIS, PREFIX_MEDICATION, PREFIX_FOLLOWUP);
+
+ EditVisitCommand.EditVisitDescriptor editVisitDescriptor = new EditVisitCommand.EditVisitDescriptor();
+
+ if (argMultimap.getValue(PREFIX_NRIC).isPresent()) {
+ editVisitDescriptor.setNric(ParserUtil.parseNric(argMultimap.getValue(PREFIX_NRIC).get()));
+ }
+ if (argMultimap.getValue(PREFIX_DATE).isPresent()) {
+ editVisitDescriptor.setDateTime(ParserUtil.parseDate(argMultimap.getValue(PREFIX_DATE).get()));
+ }
+ if (argMultimap.getValue(PREFIX_REMARK).isPresent()) {
+ editVisitDescriptor.setRemark(ParserUtil.parseRemark(argMultimap.getValue(PREFIX_REMARK).get()));
+ }
+ if (argMultimap.getValue(PREFIX_SYMPTOM).isPresent()) {
+ editVisitDescriptor.setSymptom(new Symptom(argMultimap.getValue(PREFIX_SYMPTOM).get()));
+ }
+ if (argMultimap.getValue(PREFIX_DIAGNOSIS).isPresent()) {
+ editVisitDescriptor.setDiagnosis(new Diagnosis(argMultimap.getValue(PREFIX_DIAGNOSIS).get()));
+ }
+ if (argMultimap.getValue(PREFIX_MEDICATION).isPresent()) {
+ editVisitDescriptor.setMedication(new Medication(argMultimap.getValue(PREFIX_MEDICATION).get()));
+ }
+ if (argMultimap.getValue(PREFIX_FOLLOWUP).isPresent()) {
+ editVisitDescriptor.setFollowUp(new FollowUp(argMultimap.getValue(PREFIX_FOLLOWUP).get()));
+ }
+
+ if (!editVisitDescriptor.isAnyFieldEdited()) {
+ throw new ParseException(EditVisitCommand.MESSAGE_NOT_EDITED);
+ }
+
+ return new EditVisitCommand(index, editVisitDescriptor);
+ }
+}
diff --git a/src/main/java/seedu/address/logic/parser/ExportCommandParser.java b/src/main/java/seedu/address/logic/parser/ExportCommandParser.java
new file mode 100644
index 00000000000..4c3507c61c9
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/ExportCommandParser.java
@@ -0,0 +1,26 @@
+package seedu.address.logic.parser;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import seedu.address.logic.commands.ExportCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+/**
+ * Parses input arguments and creates a new {@link ExportCommand}.
+ */
+public class ExportCommandParser implements Parser {
+
+ @Override
+ public ExportCommand parse(String args) throws ParseException {
+ requireNonNull(args);
+
+ try {
+ String fileType = ParserUtil.parseFileType(args);
+ return new ExportCommand(fileType);
+ } catch (ParseException pe) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ExportCommand.MESSAGE_USAGE), pe);
+ }
+
+ }
+}
diff --git a/src/main/java/seedu/address/logic/parser/ListCommandParser.java b/src/main/java/seedu/address/logic/parser/ListCommandParser.java
new file mode 100644
index 00000000000..91c17aa33a5
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/ListCommandParser.java
@@ -0,0 +1,46 @@
+package seedu.address.logic.parser;
+
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_LIMIT;
+
+import seedu.address.logic.commands.ListCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+/**
+ * Parses input arguments and creates a new {@code ListCommand} object.
+ */
+public class ListCommandParser {
+
+ /**
+ * Parses the given {@code String} of arguments and returns a {@code ListCommand}.
+ *
+ * @param args Input string after command word.
+ * @return A {@code ListCommand} based on the parsed input.
+ * @throws ParseException If the input does not conform to the expected format.
+ */
+ public ListCommand parse(String args) throws ParseException {
+
+ if (args.trim().isEmpty()) {
+ return new ListCommand();
+ }
+
+ ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_LIMIT);
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_LIMIT);
+
+ int limit;
+
+ try {
+ limit = Integer.parseInt(argMultimap.getValue(PREFIX_LIMIT).orElse(""));
+ if (limit < 0) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ListCommand.MESSAGE_USAGE
+ + "\n" + ListCommand.MESSAGE_LIMIT_CONSTRAINTS)
+ );
+ }
+ } catch (NumberFormatException ive) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ListCommand.MESSAGE_USAGE), ive);
+ }
+
+ return new ListCommand(limit);
+ }
+
+}
diff --git a/src/main/java/seedu/address/logic/parser/ListVisitsCommandParser.java b/src/main/java/seedu/address/logic/parser/ListVisitsCommandParser.java
new file mode 100644
index 00000000000..53e056c0c07
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/ListVisitsCommandParser.java
@@ -0,0 +1,107 @@
+package seedu.address.logic.parser;
+
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DIAGNOSIS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_FROM;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_LIMIT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_MEDICATION;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_SYMPTOM;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_TO;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_TODAY;
+
+import java.time.LocalDate;
+
+import seedu.address.logic.commands.ListVisitsCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+import seedu.address.model.person.DateTime;
+import seedu.address.model.person.Diagnosis;
+import seedu.address.model.person.Medication;
+import seedu.address.model.person.Nric;
+import seedu.address.model.person.Symptom;
+
+/**
+ * Parses input arguments and creates a new {@code ListVisitsCommand} object.
+ */
+public class ListVisitsCommandParser {
+
+ /**
+ * Parses the given {@code String} of arguments and returns a {@code ListVisitsCommand}.
+ *
+ * @param args Input string after command word.
+ * @return A {@code ListVisitsCommand} based on the parsed input.
+ * @throws ParseException If the input does not conform to the expected format.
+ */
+ public ListVisitsCommand parse(String args) throws ParseException {
+ ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NRIC, PREFIX_LIMIT,
+ PREFIX_FROM, PREFIX_TO, PREFIX_TODAY, PREFIX_SYMPTOM,
+ PREFIX_DIAGNOSIS, PREFIX_MEDICATION);
+
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NRIC, PREFIX_LIMIT, PREFIX_FROM, PREFIX_TO,
+ PREFIX_TODAY, PREFIX_SYMPTOM, PREFIX_DIAGNOSIS, PREFIX_MEDICATION);
+
+ if (!argMultimap.getPreamble().isEmpty()) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
+ ListVisitsCommand.MESSAGE_USAGE));
+ }
+ Nric nric = null;
+ Integer limit = null;
+ LocalDate from = null;
+ LocalDate to = null;
+ Diagnosis diagnosis = null;
+ Symptom symptom = null;
+ Medication medication = null;
+
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NRIC, PREFIX_LIMIT,
+ PREFIX_FROM, PREFIX_TO, PREFIX_TODAY, PREFIX_SYMPTOM,
+ PREFIX_DIAGNOSIS, PREFIX_MEDICATION);
+ if (argMultimap.getValue(PREFIX_NRIC).isPresent()) {
+ nric = ParserUtil.parseNric(argMultimap.getValue(PREFIX_NRIC).get());
+ }
+
+ if (argMultimap.getValue(PREFIX_LIMIT).isPresent()) {
+ try {
+ limit = Integer.parseInt(argMultimap.getValue(PREFIX_LIMIT).get());
+ } catch (NumberFormatException e) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
+ ListVisitsCommand.MESSAGE_USAGE), e);
+ }
+ }
+
+ if (argMultimap.getValue(PREFIX_FROM).isPresent()) {
+ String fromInput = argMultimap.getValue(PREFIX_FROM).get();
+ if (!DateTime.isValidDateOnly(fromInput)) {
+ throw new ParseException(DateTime.MESSAGE_CONSTRAINTS_DATE_ONLY);
+ }
+ from = LocalDate.parse(fromInput);
+ }
+
+ if (argMultimap.getValue(PREFIX_TO).isPresent()) {
+ String toInput = argMultimap.getValue(PREFIX_TO).get();
+ if (!DateTime.isValidDateOnly(toInput)) {
+ throw new ParseException(DateTime.MESSAGE_CONSTRAINTS_DATE_ONLY);
+ }
+ to = LocalDate.parse(toInput);
+ }
+
+ boolean isToday = argMultimap.getValue(PREFIX_TODAY).isPresent();
+
+ if ((from != null || to != null) && isToday) {
+ throw new ParseException("Cannot use both 'today/' and 'from/… to/…' together.");
+ }
+
+ if (argMultimap.getValue(PREFIX_DIAGNOSIS).isPresent()) {
+ diagnosis = ParserUtil.parseDiagnosis(argMultimap.getValue(PREFIX_DIAGNOSIS).get());
+ }
+
+ if (argMultimap.getValue(PREFIX_SYMPTOM).isPresent()) {
+ symptom = ParserUtil.parseSymptom(argMultimap.getValue(PREFIX_SYMPTOM).get());
+ }
+
+ if (argMultimap.getValue(PREFIX_MEDICATION).isPresent()) {
+ medication = ParserUtil.parseMedication(argMultimap.getValue(PREFIX_MEDICATION).get());
+ }
+
+ return new ListVisitsCommand(nric, limit, from, to, isToday, symptom, diagnosis, medication);
+ }
+}
diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/MedLoggerParser.java
similarity index 59%
rename from src/main/java/seedu/address/logic/parser/AddressBookParser.java
rename to src/main/java/seedu/address/logic/parser/MedLoggerParser.java
index 3149ee07e0b..7af3abe5491 100644
--- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java
+++ b/src/main/java/seedu/address/logic/parser/MedLoggerParser.java
@@ -8,27 +8,35 @@
import java.util.regex.Pattern;
import seedu.address.commons.core.LogsCenter;
-import seedu.address.logic.commands.AddCommand;
+import seedu.address.logic.commands.AddPersonCommand;
+import seedu.address.logic.commands.AddVisitCommand;
import seedu.address.logic.commands.ClearCommand;
+import seedu.address.logic.commands.ClearVisitsCommand;
import seedu.address.logic.commands.Command;
import seedu.address.logic.commands.DeleteCommand;
-import seedu.address.logic.commands.EditCommand;
+import seedu.address.logic.commands.DeleteVisitCommand;
+import seedu.address.logic.commands.EditPersonCommand;
+import seedu.address.logic.commands.EditVisitCommand;
import seedu.address.logic.commands.ExitCommand;
+import seedu.address.logic.commands.ExportCommand;
import seedu.address.logic.commands.FindCommand;
import seedu.address.logic.commands.HelpCommand;
import seedu.address.logic.commands.ListCommand;
+import seedu.address.logic.commands.ListVisitsCommand;
+import seedu.address.logic.commands.RemarkCommand;
+import seedu.address.logic.commands.SortVisitsCommand;
import seedu.address.logic.parser.exceptions.ParseException;
/**
* Parses user input.
*/
-public class AddressBookParser {
+public class MedLoggerParser {
/**
* Used for initial separation of command word and args.
*/
private static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)");
- private static final Logger logger = LogsCenter.getLogger(AddressBookParser.class);
+ private static final Logger logger = LogsCenter.getLogger(MedLoggerParser.class);
/**
* Parses user input into command for execution.
@@ -53,15 +61,18 @@ public Command parseCommand(String userInput) throws ParseException {
switch (commandWord) {
- case AddCommand.COMMAND_WORD:
- return new AddCommandParser().parse(arguments);
+ case AddPersonCommand.COMMAND_WORD:
+ return new AddPersonCommandParser().parse(arguments);
- case EditCommand.COMMAND_WORD:
- return new EditCommandParser().parse(arguments);
+ case EditPersonCommand.COMMAND_WORD:
+ return new EditPersonCommandParser().parse(arguments);
case DeleteCommand.COMMAND_WORD:
return new DeleteCommandParser().parse(arguments);
+ case DeleteVisitCommand.COMMAND_WORD:
+ return new DeleteVisitCommandParser().parse(arguments);
+
case ClearCommand.COMMAND_WORD:
return new ClearCommand();
@@ -69,7 +80,7 @@ public Command parseCommand(String userInput) throws ParseException {
return new FindCommandParser().parse(arguments);
case ListCommand.COMMAND_WORD:
- return new ListCommand();
+ return new ListCommandParser().parse(arguments);
case ExitCommand.COMMAND_WORD:
return new ExitCommand();
@@ -77,6 +88,27 @@ public Command parseCommand(String userInput) throws ParseException {
case HelpCommand.COMMAND_WORD:
return new HelpCommand();
+ case RemarkCommand.COMMAND_WORD:
+ return new RemarkCommandParser().parse(arguments);
+
+ case AddVisitCommand.COMMAND_WORD:
+ return new AddVisitCommandParser().parse(arguments);
+
+ case EditVisitCommand.COMMAND_WORD:
+ return new EditVisitCommandParser().parse(arguments);
+
+ case ExportCommand.COMMAND_WORD:
+ return new ExportCommandParser().parse(arguments);
+
+ case ListVisitsCommand.COMMAND_WORD:
+ return new ListVisitsCommandParser().parse(arguments);
+
+ case ClearVisitsCommand.COMMAND_WORD:
+ return new ClearVisitsCommand();
+
+ case SortVisitsCommand.COMMAND_WORD:
+ return new SortVisitsCommandParser().parse(arguments);
+
default:
logger.finer("This user input caused a ParseException: " + userInput);
throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java
index b117acb9c55..64a02cbd996 100644
--- a/src/main/java/seedu/address/logic/parser/ParserUtil.java
+++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java
@@ -10,9 +10,15 @@
import seedu.address.commons.util.StringUtil;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Address;
+import seedu.address.model.person.DateTime;
+import seedu.address.model.person.Diagnosis;
import seedu.address.model.person.Email;
+import seedu.address.model.person.Medication;
import seedu.address.model.person.Name;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
+import seedu.address.model.person.Symptom;
import seedu.address.model.tag.Tag;
/**
@@ -22,6 +28,10 @@ public class ParserUtil {
public static final String MESSAGE_INVALID_INDEX = "Index is not a non-zero unsigned integer.";
+ public static final String MESSAGE_INVALID_PATH = "Path is not a valid path";
+
+ public static final String MESSAGE_INVALID_FILE_TYPE = "The file type is not valid, choose either csv or json";
+
/**
* Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be
* trimmed.
@@ -50,6 +60,21 @@ public static Name parseName(String name) throws ParseException {
return new Name(trimmedName);
}
+ /**
+ * Parses a {@code String Nric} into a {@code Nric}.
+ * Leading and trailing whitespaces will be trimmed.
+ *
+ * @throws ParseException if the given {@code Nric} is invalid.
+ */
+ public static Nric parseNric(String nric) throws ParseException {
+ requireNonNull(nric);
+ String trimmedName = nric.trim();
+ if (!Nric.isValidNric(trimmedName)) {
+ throw new ParseException(Nric.MESSAGE_CONSTRAINTS);
+ }
+ return new Nric(trimmedName);
+ }
+
/**
* Parses a {@code String phone} into a {@code Phone}.
* Leading and trailing whitespaces will be trimmed.
@@ -80,6 +105,21 @@ public static Address parseAddress(String address) throws ParseException {
return new Address(trimmedAddress);
}
+ /**
+ * Parses a {@code String dateTime} into an {@code DateTime}.
+ * Leading and trailing whitespaces will be trimmed.
+ *
+ * @throws ParseException if the given {@code DateTime} is invalid.
+ */
+ public static DateTime parseDate(String dateTime) throws ParseException {
+ requireNonNull(dateTime);
+ String trimmedDate = dateTime.trim();
+ if (!DateTime.isValidDate(trimmedDate)) {
+ throw new ParseException(DateTime.MESSAGE_CONSTRAINTS);
+ }
+ return new DateTime(trimmedDate);
+ }
+
/**
* Parses a {@code String email} into an {@code Email}.
* Leading and trailing whitespaces will be trimmed.
@@ -95,6 +135,16 @@ public static Email parseEmail(String email) throws ParseException {
return new Email(trimmedEmail);
}
+ /**
+ * Parses a {@code String remark} into an {@code Remark}.
+ * Leading and trailing whitespaces will be trimmed.
+ */
+ public static Remark parseRemark(String remark) {
+ requireNonNull(remark);
+ String trimmedRemark = remark.trim();
+ return new Remark(remark);
+ }
+
/**
* Parses a {@code String tag} into a {@code Tag}.
* Leading and trailing whitespaces will be trimmed.
@@ -121,4 +171,60 @@ public static Set parseTags(Collection tags) throws ParseException
}
return tagSet;
}
+
+ /**
+ * Splits the given string into words using whitespace as the delimiter.
+ */
+ public static String[] parseAll(String s) {
+ s = s.trim();
+ return s.isEmpty() ? new String[0] : s.split("\\s+");
+ }
+
+ /**
+ * Parses the file type from the given argument string.
+ * Expects exactly one word (e.g., "csv" or "json").
+ */
+ public static String parseFileType(String args) throws ParseException {
+ String[] words = parseAll(args);
+ if (words.length != 1) {
+ throw new ParseException(MESSAGE_INVALID_FILE_TYPE);
+ }
+ return words[0];
+ }
+
+ /**
+ * Parses a {@code String symptom} into a {@code Symptom}.
+ * Similar to Remark.
+ *
+ * @param symptom The symptom to be parsed.
+ */
+ public static Symptom parseSymptom(String symptom) {
+ requireNonNull(symptom);
+ String trimmed = symptom.trim();
+ return new Symptom(trimmed);
+ }
+
+ /**
+ * Parses a {@code String diagnosis} into a {@code Diagnosis}.
+ * Similar to Remark.
+ *
+ * @param diagnosis The diagnosis to be parsed.
+ */
+ public static Diagnosis parseDiagnosis(String diagnosis) {
+ requireNonNull(diagnosis);
+ String trimmed = diagnosis.trim();
+ return new Diagnosis(trimmed);
+ }
+
+ /**
+ * Parses a {@code String medication} into a {@code Medication}.
+ * Similar to Remark.
+ *
+ * @param medication The medication to be parsed.
+ */
+ public static Medication parseMedication(String medication) {
+ requireNonNull(medication);
+ String trimmed = medication.trim();
+ return new Medication(trimmed);
+ }
}
diff --git a/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
new file mode 100644
index 00000000000..4a46e492177
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
@@ -0,0 +1,39 @@
+package seedu.address.logic.parser;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.commons.exceptions.IllegalValueException;
+import seedu.address.logic.commands.RemarkCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+import seedu.address.model.person.Remark;
+
+/**
+ * Parses input arguments and creates a new {@code RemarkCommand} object
+ */
+public class RemarkCommandParser implements Parser {
+ /**
+ * Parses the given {@code String} of arguments in the context of the {@code RemarkCommand}
+ * and returns a {@code RemarkCommand} object for execution.
+ * @throws ParseException if the user input does not conform the expected format
+ */
+ public RemarkCommand parse(String args) throws ParseException {
+ requireNonNull(args);
+ ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_REMARK);
+
+ Index index;
+
+ try {
+ index = ParserUtil.parseIndex(argMultimap.getPreamble());
+ } catch (IllegalValueException ive) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, RemarkCommand.MESSAGE_USAGE), ive);
+ }
+
+ argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_REMARK);
+ String remark = argMultimap.getValue(PREFIX_REMARK).orElse("");
+
+ return new RemarkCommand(index, new Remark(remark));
+ }
+}
diff --git a/src/main/java/seedu/address/logic/parser/SortVisitsCommandParser.java b/src/main/java/seedu/address/logic/parser/SortVisitsCommandParser.java
new file mode 100644
index 00000000000..b929a1decce
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/SortVisitsCommandParser.java
@@ -0,0 +1,28 @@
+package seedu.address.logic.parser;
+
+import seedu.address.logic.commands.SortVisitsCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+/**
+ * Parses arguments for the sortVisits command.
+ */
+public class SortVisitsCommandParser implements Parser {
+
+ private static final String ASC = "";
+ private static final String DESC = "desc";
+
+ @Override
+ public SortVisitsCommand parse(String args) throws ParseException {
+ String trimmed = args.trim().toLowerCase();
+
+ if (trimmed.equals(ASC)) {
+ return new SortVisitsCommand(false); // Ascending
+ } else if (trimmed.equals(DESC)) {
+ return new SortVisitsCommand(true); // Descending
+ } else {
+ throw new ParseException("Invalid sort direction. Use either:\n"
+ + " sortvisits (ascending)\n"
+ + " sortvisits desc (descending)");
+ }
+ }
+}
diff --git a/src/main/java/seedu/address/model/AddressBook.java b/src/main/java/seedu/address/model/AddressBook.java
deleted file mode 100644
index 73397161e84..00000000000
--- a/src/main/java/seedu/address/model/AddressBook.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package seedu.address.model;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.List;
-
-import javafx.collections.ObservableList;
-import seedu.address.commons.util.ToStringBuilder;
-import seedu.address.model.person.Person;
-import seedu.address.model.person.UniquePersonList;
-
-/**
- * Wraps all data at the address-book level
- * Duplicates are not allowed (by .isSamePerson comparison)
- */
-public class AddressBook implements ReadOnlyAddressBook {
-
- private final UniquePersonList persons;
-
- /*
- * The 'unusual' code block below is a non-static initialization block, sometimes used to avoid duplication
- * between constructors. See https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
- *
- * Note that non-static init blocks are not recommended to use. There are other ways to avoid duplication
- * among constructors.
- */
- {
- persons = new UniquePersonList();
- }
-
- public AddressBook() {}
-
- /**
- * Creates an AddressBook using the Persons in the {@code toBeCopied}
- */
- public AddressBook(ReadOnlyAddressBook toBeCopied) {
- this();
- resetData(toBeCopied);
- }
-
- //// list overwrite operations
-
- /**
- * Replaces the contents of the person list with {@code persons}.
- * {@code persons} must not contain duplicate persons.
- */
- public void setPersons(List persons) {
- this.persons.setPersons(persons);
- }
-
- /**
- * Resets the existing data of this {@code AddressBook} with {@code newData}.
- */
- public void resetData(ReadOnlyAddressBook newData) {
- requireNonNull(newData);
-
- setPersons(newData.getPersonList());
- }
-
- //// person-level operations
-
- /**
- * Returns true if a person with the same identity as {@code person} exists in the address book.
- */
- public boolean hasPerson(Person person) {
- requireNonNull(person);
- return persons.contains(person);
- }
-
- /**
- * Adds a person to the address book.
- * The person must not already exist in the address book.
- */
- public void addPerson(Person p) {
- persons.add(p);
- }
-
- /**
- * Replaces the given person {@code target} in the list with {@code editedPerson}.
- * {@code target} must exist in the address book.
- * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.
- */
- public void setPerson(Person target, Person editedPerson) {
- requireNonNull(editedPerson);
-
- persons.setPerson(target, editedPerson);
- }
-
- /**
- * Removes {@code key} from this {@code AddressBook}.
- * {@code key} must exist in the address book.
- */
- public void removePerson(Person key) {
- persons.remove(key);
- }
-
- //// util methods
-
- @Override
- public String toString() {
- return new ToStringBuilder(this)
- .add("persons", persons)
- .toString();
- }
-
- @Override
- public ObservableList getPersonList() {
- return persons.asUnmodifiableObservableList();
- }
-
- @Override
- public boolean equals(Object other) {
- if (other == this) {
- return true;
- }
-
- // instanceof handles nulls
- if (!(other instanceof AddressBook)) {
- return false;
- }
-
- AddressBook otherAddressBook = (AddressBook) other;
- return persons.equals(otherAddressBook.persons);
- }
-
- @Override
- public int hashCode() {
- return persons.hashCode();
- }
-}
diff --git a/src/main/java/seedu/address/model/MedLogger.java b/src/main/java/seedu/address/model/MedLogger.java
new file mode 100644
index 00000000000..cf6b6f0a1ba
--- /dev/null
+++ b/src/main/java/seedu/address/model/MedLogger.java
@@ -0,0 +1,234 @@
+package seedu.address.model;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+
+import java.util.List;
+import java.util.Optional;
+
+import javafx.collections.ObservableList;
+import seedu.address.commons.util.ToStringBuilder;
+import seedu.address.model.person.Nric;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.PersonVisitDictionary;
+import seedu.address.model.person.UniquePersonList;
+import seedu.address.model.person.UniqueVisitList;
+import seedu.address.model.person.Visit;
+
+/**
+ * Wraps all data at the address-book level
+ * Duplicates are not allowed (by .isSamePerson comparison)
+ */
+public class MedLogger implements ReadOnlyMedLogger {
+
+ private static final String MESSAGE_NO_PERSON_FOR_VISIT = "There is no person who have a matching profile to "
+ + "this visit in the person list";
+ private final UniquePersonList persons;
+ private final UniqueVisitList visits;
+ private final PersonVisitDictionary dictionary;
+
+ /*
+ * The 'unusual' code block below is a non-static initialization block, sometimes used to avoid duplication
+ * between constructors. See https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
+ *
+ * Note that non-static init blocks are not recommended to use. There are other ways to avoid duplication
+ * among constructors.
+ */
+ {
+ persons = new UniquePersonList();
+ visits = new UniqueVisitList();
+ dictionary = new PersonVisitDictionary();
+ }
+
+ public MedLogger() {}
+
+ /**
+ * Creates an MedLogger using the Persons in the {@code toBeCopied}
+ */
+ public MedLogger(ReadOnlyMedLogger toBeCopied) {
+ this();
+ resetData(toBeCopied);
+ }
+
+ //// list overwrite operations
+
+ /**
+ * Replaces the contents of the person list with {@code persons}.
+ * {@code persons} must not contain duplicate persons.
+ */
+ public void setPersons(List persons) {
+ this.persons.setPersons(persons);
+ }
+
+ /**
+ * Replaces the contents of the visit list with {@code visits}.
+ * {@code visits} must not contain duplicate persons.
+ */
+ public void setVisits(List visits) {
+ this.visits.setVisits(visits);
+ }
+
+ /**
+ * Replaces the contents of the dictionary with {@code dictionary}.
+ */
+ public void setDictionary(PersonVisitDictionary dictionary) {
+ this.dictionary.setDictionary(dictionary.getDictionary());
+ }
+
+ /**
+ * Resets the existing data of this {@code MedLogger} with {@code newData}.
+ */
+ public void resetData(ReadOnlyMedLogger newData) {
+ requireNonNull(newData);
+ setPersons(newData.getPersonList());
+ setVisits(newData.getVisitList());
+ setDictionary(newData.getDictionary());
+ }
+
+ /**
+ * Returns true if {@code visit} already exists in the list of visits.
+ */
+ public boolean hasVisit(Visit visit) {
+ requireNonNull(visit);
+ return this.visits.contains(visit);
+ }
+
+ /**
+ * Adds a visit to the list of visits.
+ * The visit must not already exist in the list.
+ */
+ public void addVisit(Visit visit) {
+ requireNonNull(visit);
+ this.visits.add(visit);
+ this.dictionary.addVisit(visit);
+ }
+
+ /**
+ * Replaces the given visit {@code target} in the list with {@code editedVisit}.
+ * {@code target} must exist in the Med Logger.
+ * The {@code editedVisit} must not be the same as another existing visit in the Med Logger.
+ */
+ public void setVisit(Visit target, Visit editedVisit) {
+ requireNonNull(editedVisit);
+ visits.setVisit(target, editedVisit);
+ dictionary.setVisit(target, editedVisit);
+ }
+
+ /**
+ * Removes {@code visit} from this {@code MedLogger}.
+ * {@code key} must exist in the Med Logger.
+ */
+ public void removeVisit(Visit target) {
+ visits.remove(target);
+ dictionary.removeVisit(target);
+ }
+
+ /**
+ * Remove all visits from this {@code MedLogger}.
+ */
+ public void clearVisits() {
+ List copy = List.copyOf(this.getVisitList());
+ for (Visit visit: copy) {
+ this.removeVisit(visit);
+ }
+ }
+
+ //// person-level operations
+
+ /**
+ * Returns true if a person with the same identity as {@code person} exists in the Med Logger.
+ */
+ public boolean hasPerson(Person person) {
+ requireNonNull(person);
+ return persons.contains(person);
+ }
+
+ /**
+ * Adds a person to the Med Logger.
+ * The person must not already exist in the Med Logger.
+ */
+ public void addPerson(Person p) {
+ persons.add(p);
+ dictionary.addPerson(p);
+ }
+
+ /**
+ * Replaces the given person {@code target} in the list with {@code editedPerson}.
+ * {@code target} must exist in the Med Logger.
+ * The person identity of {@code editedPerson} must not be the same as another existing person in the Med Logger.
+ */
+ public void setPerson(Person target, Person editedPerson) {
+ requireAllNonNull(target, editedPerson);
+ persons.setPerson(target, editedPerson);
+ for (Visit visit : dictionary.getVisitsForPerson(target)) {
+ visits.setVisit(visit, visit.withPerson(editedPerson));
+ }
+ dictionary.setPerson(target, editedPerson);
+ }
+
+ /**
+ * Removes {@code key} from this {@code MedLogger}.
+ * {@code key} must exist in the Med Logger.
+ */
+ public void removePerson(Person key) {
+ persons.remove(key);
+ for (Visit visit : dictionary.getVisitsForPerson(key)) {
+ visits.remove(visit);
+ }
+ dictionary.removePerson(key);
+ }
+
+ //// util methods
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .add("persons", persons)
+ .add("visits", visits)
+ .toString();
+ }
+
+ @Override
+ public ObservableList getPersonList() {
+ return persons.asUnmodifiableObservableList();
+ }
+
+ @Override
+ public ObservableList getVisitList() {
+ return visits.asUnmodifiableObservableList();
+ }
+
+ @Override
+ public PersonVisitDictionary getDictionary() {
+ return dictionary;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof MedLogger)) {
+ return false;
+ }
+
+ MedLogger otherMedLogger = (MedLogger) other;
+ return persons.equals(otherMedLogger.persons);
+ }
+
+ @Override
+ public int hashCode() {
+ return persons.hashCode();
+ }
+
+ /**
+ * Retrieves a {@code Person} with the specified NRIC.
+ * If a {@code Person} is found, it is returned wrapped in an
+ * {@code Optional}; otherwise, an empty {@code Optional} is returned.
+ */
+ public Optional getPersonByNric(Nric nric) {
+ return persons.getPersonByNric(nric);
+ }
+}
diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java
index d54df471c1f..f3874d2d4de 100644
--- a/src/main/java/seedu/address/model/Model.java
+++ b/src/main/java/seedu/address/model/Model.java
@@ -1,11 +1,15 @@
package seedu.address.model;
import java.nio.file.Path;
+import java.util.Comparator;
+import java.util.Optional;
import java.util.function.Predicate;
import javafx.collections.ObservableList;
import seedu.address.commons.core.GuiSettings;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
+import seedu.address.model.person.Visit;
/**
* The API of the Model component.
@@ -13,6 +17,7 @@
public interface Model {
/** {@code Predicate} that always evaluate to true */
Predicate PREDICATE_SHOW_ALL_PERSONS = unused -> true;
+ Predicate PREDICATE_SHOW_ALL_VISITS = unused -> true;
/**
* Replaces user prefs data with the data in {@code userPrefs}.
@@ -35,53 +40,111 @@ public interface Model {
void setGuiSettings(GuiSettings guiSettings);
/**
- * Returns the user prefs' address book file path.
+ * Returns the user prefs' Med Logger file path.
*/
- Path getAddressBookFilePath();
+ Path getMedLoggerFilePath();
/**
- * Sets the user prefs' address book file path.
+ * Sets the user prefs' Med Logger file path.
*/
- void setAddressBookFilePath(Path addressBookFilePath);
+ void setMedLoggerFilePath(Path medLoggerFilePath);
/**
- * Replaces address book data with the data in {@code addressBook}.
+ * Replaces Med Logger data with the data in {@code medLogger}.
*/
- void setAddressBook(ReadOnlyAddressBook addressBook);
+ void setMedLogger(ReadOnlyMedLogger medLogger);
- /** Returns the AddressBook */
- ReadOnlyAddressBook getAddressBook();
+ /**
+ * Clears visit data in Med logger
+ */
+ void clearVisits();
+
+
+ /** Returns the MedLogger */
+ ReadOnlyMedLogger getMedLogger();
/**
- * Returns true if a person with the same identity as {@code person} exists in the address book.
+ * Returns true if a person with the same identity as {@code person} exists in the Med Logger.
*/
boolean hasPerson(Person person);
+ /**
+ * Retrieves a {@code Person} with the specified NRIC.
+ * If a {@code Person} is found, it is returned wrapped in an
+ * {@code Optional}; otherwise, an empty {@code Optional} is returned.
+ */
+ Optional getPersonByNric(Nric nric);
+
+ /**
+ * Returns true if a vist with the same details as {@code vist} exists in the Med Logger.
+ */
+ boolean hasVisit(Visit visit);
+
+ void addVisit(Visit visit);
+
+ /**
+ * Deletes the given visit.
+ * The visit must exist in the Medlogger
+ */
+ void deleteVisit(Visit target);
+
+ void setVisit(Visit target, Visit editedVisit);
+
/**
* Deletes the given person.
- * The person must exist in the address book.
+ * The person must exist in the Med Logger.
*/
void deletePerson(Person target);
/**
* Adds the given person.
- * {@code person} must not already exist in the address book.
+ * {@code person} must not already exist in the Med Logger.
*/
void addPerson(Person person);
/**
* Replaces the given person {@code target} with {@code editedPerson}.
- * {@code target} must exist in the address book.
- * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.
+ * {@code target} must exist in the Med Logger.
+ * The person identity of {@code editedPerson} must not be the same as another existing person in the Med Logger.
*/
void setPerson(Person target, Person editedPerson);
/** Returns an unmodifiable view of the filtered person list */
ObservableList getFilteredPersonList();
+ /**
+ * Returns an unmodifiable view of the filtered visit list
+ */
+ ObservableList getFilteredVisitList();
+
/**
* Updates the filter of the filtered person list to filter by the given {@code predicate}.
* @throws NullPointerException if {@code predicate} is null.
*/
void updateFilteredPersonList(Predicate predicate);
+
+ /**
+ * Updates the filter of the filtered visit list to filter by the given {@code predicate}.
+ * @throws NullPointerException if {@code predicate} is null.
+ */
+ void updateFilteredVisitList(Predicate predicate);
+
+ void sortFilteredVisitList(Comparator comparator);
+
+ /**
+ * Updates the filter of the filtered person list up to the first n entries.
+ * @param n number of entries to show
+ */
+ void updateSubFilteredPersonList(int n);
+
+ /**
+ * Updates the filter of the filtered visit list up to the first n entries.
+ * @param n number of entries to show
+ */
+ void updateSubFilteredVisitList(int n);
+
+ ObservableList getSortedVisitList();
+
+
+ int size();
}
diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java
index 57bc563fde6..d503933341e 100644
--- a/src/main/java/seedu/address/model/ModelManager.java
+++ b/src/main/java/seedu/address/model/ModelManager.java
@@ -4,40 +4,52 @@
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
import java.nio.file.Path;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
import java.util.function.Predicate;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
+import javafx.collections.transformation.SortedList;
import seedu.address.commons.core.GuiSettings;
import seedu.address.commons.core.LogsCenter;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
+import seedu.address.model.person.Visit;
/**
- * Represents the in-memory model of the address book data.
+ * Represents the in-memory model of the Med Logger data.
*/
public class ModelManager implements Model {
private static final Logger logger = LogsCenter.getLogger(ModelManager.class);
- private final AddressBook addressBook;
+ private final MedLogger medLogger;
private final UserPrefs userPrefs;
private final FilteredList filteredPersons;
+ private final FilteredList filteredVisits;
+ private final SortedList sortedVisits;
+
/**
- * Initializes a ModelManager with the given addressBook and userPrefs.
+ * Initializes a ModelManager with the given medLogger and userPrefs.
*/
- public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) {
- requireAllNonNull(addressBook, userPrefs);
+ public ModelManager(ReadOnlyMedLogger medLogger, ReadOnlyUserPrefs userPrefs) {
+ requireAllNonNull(medLogger, userPrefs);
- logger.fine("Initializing with address book: " + addressBook + " and user prefs " + userPrefs);
+ logger.fine("Initializing with Med Logger: " + medLogger + " and user prefs " + userPrefs);
- this.addressBook = new AddressBook(addressBook);
+ this.medLogger = new MedLogger(medLogger);
this.userPrefs = new UserPrefs(userPrefs);
- filteredPersons = new FilteredList<>(this.addressBook.getPersonList());
+ filteredPersons = new FilteredList<>(this.medLogger.getPersonList());
+ filteredVisits = new FilteredList<>(this.medLogger.getVisitList());
+ sortedVisits = new SortedList<>(filteredVisits);
}
public ModelManager() {
- this(new AddressBook(), new UserPrefs());
+ this(new MedLogger(), new UserPrefs());
}
//=========== UserPrefs ==================================================================================
@@ -65,42 +77,76 @@ public void setGuiSettings(GuiSettings guiSettings) {
}
@Override
- public Path getAddressBookFilePath() {
- return userPrefs.getAddressBookFilePath();
+ public Path getMedLoggerFilePath() {
+ return userPrefs.getMedLoggerFilePath();
}
@Override
- public void setAddressBookFilePath(Path addressBookFilePath) {
- requireNonNull(addressBookFilePath);
- userPrefs.setAddressBookFilePath(addressBookFilePath);
+ public void setMedLoggerFilePath(Path medLoggerFilePath) {
+ requireNonNull(medLoggerFilePath);
+ userPrefs.setMedLoggerFilePath(medLoggerFilePath);
}
- //=========== AddressBook ================================================================================
+ //=========== MedLogger ================================================================================
+
+ @Override
+ public void setMedLogger(ReadOnlyMedLogger medLogger) {
+ this.medLogger.resetData(medLogger);
+ }
@Override
- public void setAddressBook(ReadOnlyAddressBook addressBook) {
- this.addressBook.resetData(addressBook);
+ public void clearVisits() {
+ this.medLogger.clearVisits();
}
@Override
- public ReadOnlyAddressBook getAddressBook() {
- return addressBook;
+ public ReadOnlyMedLogger getMedLogger() {
+ return medLogger;
}
@Override
public boolean hasPerson(Person person) {
requireNonNull(person);
- return addressBook.hasPerson(person);
+ return medLogger.hasPerson(person);
+ }
+
+ @Override
+ public boolean hasVisit(Visit visit) {
+ requireNonNull(visit);
+ return medLogger.hasVisit(visit);
+ }
+
+ @Override
+ public Optional getPersonByNric(Nric nric) {
+ return medLogger.getPersonByNric(nric);
+ }
+
+ @Override
+ public void addVisit(Visit visit) {
+ requireNonNull(visit);
+ medLogger.addVisit(visit);
+ updateFilteredVisitList(PREDICATE_SHOW_ALL_VISITS);
+ }
+
+ @Override
+ public void setVisit(Visit target, Visit editedVisit) {
+ requireAllNonNull(target, editedVisit);
+ medLogger.setVisit(target, editedVisit);
}
@Override
public void deletePerson(Person target) {
- addressBook.removePerson(target);
+ medLogger.removePerson(target);
+ }
+
+ @Override
+ public void deleteVisit(Visit target) {
+ medLogger.removeVisit(target);
}
@Override
public void addPerson(Person person) {
- addressBook.addPerson(person);
+ medLogger.addPerson(person);
updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
}
@@ -108,26 +154,68 @@ public void addPerson(Person person) {
public void setPerson(Person target, Person editedPerson) {
requireAllNonNull(target, editedPerson);
- addressBook.setPerson(target, editedPerson);
+ medLogger.setPerson(target, editedPerson);
}
//=========== Filtered Person List Accessors =============================================================
/**
* Returns an unmodifiable view of the list of {@code Person} backed by the internal list of
- * {@code versionedAddressBook}
+ * {@code versionedMedLogger}
*/
@Override
public ObservableList getFilteredPersonList() {
return filteredPersons;
}
+ @Override
+ public ObservableList getFilteredVisitList() {
+ return filteredVisits;
+ }
+
@Override
public void updateFilteredPersonList(Predicate predicate) {
requireNonNull(predicate);
filteredPersons.setPredicate(predicate);
}
+ @Override
+ public void updateFilteredVisitList(Predicate predicate) {
+ requireNonNull(predicate);
+ filteredVisits.setPredicate(predicate);
+ }
+
+ @Override
+ public void updateSubFilteredPersonList(int n) {
+ List limitedList = filteredPersons.getSource().stream()
+ .filter(PREDICATE_SHOW_ALL_PERSONS)
+ .limit(n)
+ .collect(Collectors.toList());
+
+ filteredPersons.setPredicate(limitedList::contains);
+ }
+
+ /**
+ * Sorts the filtered visit list based on the provided comparator.
+ * To force the filtered list to update, we create a new list and set the predicate to
+ *
+ * @param comparator The comparator to sort the visits.
+ */
+ @Override
+ public void sortFilteredVisitList(Comparator comparator) {
+ sortedVisits.setComparator(comparator);
+ }
+
+
+ @Override
+ public void updateSubFilteredVisitList(int n) {
+ List limitedList = filteredVisits.getSource().stream()
+ .limit(n)
+ .collect(Collectors.toList());
+
+ filteredVisits.setPredicate(limitedList::contains);
+ }
+
@Override
public boolean equals(Object other) {
if (other == this) {
@@ -140,9 +228,20 @@ public boolean equals(Object other) {
}
ModelManager otherModelManager = (ModelManager) other;
- return addressBook.equals(otherModelManager.addressBook)
+ return medLogger.equals(otherModelManager.medLogger)
&& userPrefs.equals(otherModelManager.userPrefs)
- && filteredPersons.equals(otherModelManager.filteredPersons);
+ && filteredPersons.equals(otherModelManager.filteredPersons)
+ && filteredVisits.equals(otherModelManager.filteredVisits);
+
}
+ @Override
+ public ObservableList getSortedVisitList() {
+ return sortedVisits;
+ }
+
+ @Override
+ public int size() {
+ return filteredPersons.size();
+ }
}
diff --git a/src/main/java/seedu/address/model/ReadOnlyAddressBook.java b/src/main/java/seedu/address/model/ReadOnlyAddressBook.java
deleted file mode 100644
index 6ddc2cd9a29..00000000000
--- a/src/main/java/seedu/address/model/ReadOnlyAddressBook.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package seedu.address.model;
-
-import javafx.collections.ObservableList;
-import seedu.address.model.person.Person;
-
-/**
- * Unmodifiable view of an address book
- */
-public interface ReadOnlyAddressBook {
-
- /**
- * Returns an unmodifiable view of the persons list.
- * This list will not contain any duplicate persons.
- */
- ObservableList getPersonList();
-
-}
diff --git a/src/main/java/seedu/address/model/ReadOnlyMedLogger.java b/src/main/java/seedu/address/model/ReadOnlyMedLogger.java
new file mode 100644
index 00000000000..3033f6660c2
--- /dev/null
+++ b/src/main/java/seedu/address/model/ReadOnlyMedLogger.java
@@ -0,0 +1,28 @@
+package seedu.address.model;
+
+import javafx.collections.ObservableList;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.PersonVisitDictionary;
+import seedu.address.model.person.Visit;
+
+/**
+ * Unmodifiable view of an Med Logger
+ */
+public interface ReadOnlyMedLogger {
+
+ /**
+ * Returns an unmodifiable view of the persons list.
+ * This list will not contain any duplicate persons.
+ */
+ ObservableList getPersonList();
+
+ /**
+ * Returns an unmodifiable view of the visit list.
+ */
+ ObservableList getVisitList();
+
+ /**
+ * Returns the dictionary.
+ */
+ PersonVisitDictionary getDictionary();
+}
diff --git a/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java b/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java
index befd58a4c73..c69b0e223f9 100644
--- a/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java
+++ b/src/main/java/seedu/address/model/ReadOnlyUserPrefs.java
@@ -11,6 +11,6 @@ public interface ReadOnlyUserPrefs {
GuiSettings getGuiSettings();
- Path getAddressBookFilePath();
+ Path getMedLoggerFilePath();
}
diff --git a/src/main/java/seedu/address/model/UserPrefs.java b/src/main/java/seedu/address/model/UserPrefs.java
index 6be655fb4c7..f0c1f0b227b 100644
--- a/src/main/java/seedu/address/model/UserPrefs.java
+++ b/src/main/java/seedu/address/model/UserPrefs.java
@@ -14,7 +14,7 @@
public class UserPrefs implements ReadOnlyUserPrefs {
private GuiSettings guiSettings = new GuiSettings();
- private Path addressBookFilePath = Paths.get("data" , "addressbook.json");
+ private Path medLoggerFilePath = Paths.get("data" , "MedLogger.json");
/**
* Creates a {@code UserPrefs} with default values.
@@ -35,7 +35,7 @@ public UserPrefs(ReadOnlyUserPrefs userPrefs) {
public void resetData(ReadOnlyUserPrefs newUserPrefs) {
requireNonNull(newUserPrefs);
setGuiSettings(newUserPrefs.getGuiSettings());
- setAddressBookFilePath(newUserPrefs.getAddressBookFilePath());
+ setMedLoggerFilePath(newUserPrefs.getMedLoggerFilePath());
}
public GuiSettings getGuiSettings() {
@@ -47,13 +47,13 @@ public void setGuiSettings(GuiSettings guiSettings) {
this.guiSettings = guiSettings;
}
- public Path getAddressBookFilePath() {
- return addressBookFilePath;
+ public Path getMedLoggerFilePath() {
+ return medLoggerFilePath;
}
- public void setAddressBookFilePath(Path addressBookFilePath) {
- requireNonNull(addressBookFilePath);
- this.addressBookFilePath = addressBookFilePath;
+ public void setMedLoggerFilePath(Path medLoggerFilePath) {
+ requireNonNull(medLoggerFilePath);
+ this.medLoggerFilePath = medLoggerFilePath;
}
@Override
@@ -69,19 +69,19 @@ public boolean equals(Object other) {
UserPrefs otherUserPrefs = (UserPrefs) other;
return guiSettings.equals(otherUserPrefs.guiSettings)
- && addressBookFilePath.equals(otherUserPrefs.addressBookFilePath);
+ && medLoggerFilePath.equals(otherUserPrefs.medLoggerFilePath);
}
@Override
public int hashCode() {
- return Objects.hash(guiSettings, addressBookFilePath);
+ return Objects.hash(guiSettings, medLoggerFilePath);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Gui Settings : " + guiSettings);
- sb.append("\nLocal data file location : " + addressBookFilePath);
+ sb.append("\nLocal data file location : " + medLoggerFilePath);
return sb.toString();
}
diff --git a/src/main/java/seedu/address/model/person/Address.java b/src/main/java/seedu/address/model/person/Address.java
index 469a2cc9a1e..733e9cd3b5b 100644
--- a/src/main/java/seedu/address/model/person/Address.java
+++ b/src/main/java/seedu/address/model/person/Address.java
@@ -4,12 +4,13 @@
import static seedu.address.commons.util.AppUtil.checkArgument;
/**
- * Represents a Person's address in the address book.
+ * Represents a Person's address in the Med Logger.
* Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}
*/
public class Address {
public static final String MESSAGE_CONSTRAINTS = "Addresses can take any values, and it should not be blank";
+ public static final Address DUMMY_ADDRESS = new Address("Dummy Address Singapore 123456");
/*
* The first character of the address must not be a whitespace,
diff --git a/src/main/java/seedu/address/model/person/DateTime.java b/src/main/java/seedu/address/model/person/DateTime.java
new file mode 100644
index 00000000000..7b4e4cc0402
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/DateTime.java
@@ -0,0 +1,115 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.util.AppUtil.checkArgument;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.time.format.ResolverStyle;
+
+/**
+ * Represents a DateTime in the system.
+ * Guarantees: immutable; is valid as declared in {@link #isValidDate(String)}
+ */
+public class DateTime {
+
+ public static final String MESSAGE_CONSTRAINTS = "Dates should be in the format yyyy-mm-dd HH:mm and valid";
+ public static final String MESSAGE_CONSTRAINTS_DATE_ONLY = "Dates should be in the format yyyy-mm-dd and valid";
+ public static final DateTimeFormatter FORMATTER = DateTimeFormatter
+ .ofPattern("uuuu-MM-dd HH:mm").withResolverStyle(ResolverStyle.STRICT);
+ //uuuu must be used with strict style which is needed to detect all invalid dates
+
+ /*
+ * The first character of the address must not be a whitespace,
+ * otherwise " " (a blank string) becomes a valid input.
+ */
+ public static final String VALIDATION_REGEX = "[^\\s].*";
+
+ public final String value;
+
+ /**
+ * Constructs a {@code DateTime}.
+ *
+ * @param date A valid date in yyyy-mm-dd HH:mm format.
+ */
+ public DateTime(String date) {
+ requireNonNull(date);
+ checkArgument(isValidDate(date), MESSAGE_CONSTRAINTS);
+ value = date;
+ }
+
+ /**
+ * Returns true if a given string is a valid date in yyyy-mm-dd HH:mm format.
+ */
+ public static boolean isValidDate(String date) {
+ try {
+ LocalDateTime.parse(date, FORMATTER);
+ return true;
+ } catch (DateTimeParseException e) {
+ System.out.println(e.getMessage());
+ return false;
+ }
+ }
+
+ /**
+ * Returns true if a given string is a valid date in yyyy-mm-dd format only.
+ * @param date A valid date in yyyy-mm-dd format.
+ * @return true if the date is valid.
+ */
+ public static boolean isValidDateOnly(String date) {
+ DateTimeFormatter dateOnlyFormatter = DateTimeFormatter
+ .ofPattern("uuuu-MM-dd")
+ .withResolverStyle(ResolverStyle.STRICT);
+ try {
+ LocalDate.parse(date, dateOnlyFormatter);
+ return true;
+ } catch (DateTimeParseException e) {
+ System.out.println(e.getMessage());
+ return false;
+ }
+ }
+
+ /**
+ * Returns true if a given string is a valid date in yyyy-mm-dd HH:mm format.
+ */
+ public LocalDateTime toLocalDateTime() {
+ return LocalDateTime.parse(value, FORMATTER);
+ }
+
+ /**
+ * Returns the current date and time in the format yyyy-mm-dd HH:mm.
+ * @return The current date and time
+ */
+ public static DateTime now() {
+ return new DateTime(LocalDateTime.now().format(FORMATTER));
+ }
+
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof DateTime)) {
+ return false;
+ }
+
+ DateTime otherDateTime = (DateTime) other;
+ return value.equals(otherDateTime.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/Diagnosis.java b/src/main/java/seedu/address/model/person/Diagnosis.java
new file mode 100644
index 00000000000..23e07a1fb9d
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/Diagnosis.java
@@ -0,0 +1,41 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Represents the doctor's diagnosis for a visit.
+ */
+public class Diagnosis {
+ public final String value;
+
+ /**
+ * Constructs a {@code Diagnosis}.
+ *
+ * @param value Some diagnosis.
+ */
+ public Diagnosis(String value) {
+ requireNonNull(value);
+ this.value = value;
+ }
+
+ public String toLowerCase() {
+ return value.toLowerCase();
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other == this
+ || (other instanceof Diagnosis
+ && value.equals(((Diagnosis) other).value));
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/Email.java b/src/main/java/seedu/address/model/person/Email.java
index c62e512bc29..72edeffbdda 100644
--- a/src/main/java/seedu/address/model/person/Email.java
+++ b/src/main/java/seedu/address/model/person/Email.java
@@ -4,11 +4,12 @@
import static seedu.address.commons.util.AppUtil.checkArgument;
/**
- * Represents a Person's email in the address book.
+ * Represents a Person's email in the Med Logger.
* Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}
*/
public class Email {
+ public static final Email DUMMY_EMAIL = new Email("dummyEmail@dummy.com");
private static final String SPECIAL_CHARACTERS = "+_.-";
public static final String MESSAGE_CONSTRAINTS = "Emails should be of the format local-part@domain "
+ "and adhere to the following constraints:\n"
@@ -31,6 +32,7 @@ public class Email {
private static final String DOMAIN_REGEX = "(" + DOMAIN_PART_REGEX + "\\.)*" + DOMAIN_LAST_PART_REGEX;
public static final String VALIDATION_REGEX = LOCAL_PART_REGEX + "@" + DOMAIN_REGEX;
+
public final String value;
/**
diff --git a/src/main/java/seedu/address/model/person/FollowUp.java b/src/main/java/seedu/address/model/person/FollowUp.java
new file mode 100644
index 00000000000..e8399e61e56
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/FollowUp.java
@@ -0,0 +1,37 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Represents follow-up information (e.g., review in 1 week).
+ */
+public class FollowUp {
+ public final String value;
+
+ /**
+ * Constructs a {@code FollowUp}.
+ *
+ * @param value Some follow-up information.
+ */
+ public FollowUp(String value) {
+ requireNonNull(value);
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other == this
+ || (other instanceof FollowUp
+ && value.equals(((FollowUp) other).value));
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/Medication.java b/src/main/java/seedu/address/model/person/Medication.java
new file mode 100644
index 00000000000..d03d0a30957
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/Medication.java
@@ -0,0 +1,41 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Represents medication prescribed to the patient.
+ */
+public class Medication {
+ public final String value;
+
+ /**
+ * Constructs a {@code Medication}.
+ *
+ * @param value Some medication.
+ */
+ public Medication(String value) {
+ requireNonNull(value);
+ this.value = value;
+ }
+
+ public String toLowerCase() {
+ return value.toLowerCase();
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other == this
+ || (other instanceof Medication
+ && value.equals(((Medication) other).value));
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/Name.java b/src/main/java/seedu/address/model/person/Name.java
index 173f15b9b00..c87ac2a3919 100644
--- a/src/main/java/seedu/address/model/person/Name.java
+++ b/src/main/java/seedu/address/model/person/Name.java
@@ -4,13 +4,14 @@
import static seedu.address.commons.util.AppUtil.checkArgument;
/**
- * Represents a Person's name in the address book.
+ * Represents a Person's name in the Med Logger.
* Guarantees: immutable; is valid as declared in {@link #isValidName(String)}
*/
public class Name {
public static final String MESSAGE_CONSTRAINTS =
"Names should only contain alphanumeric characters and spaces, and it should not be blank";
+ public static final Name DUMMY_NAME = new Name("dummy");
/*
* The first character of the address must not be a whitespace,
diff --git a/src/main/java/seedu/address/model/person/Nric.java b/src/main/java/seedu/address/model/person/Nric.java
new file mode 100644
index 00000000000..bb207c988f0
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/Nric.java
@@ -0,0 +1,63 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.util.AppUtil.checkArgument;
+
+/**
+ * Represents a Person's name in the Med Logger.
+ * Guarantees: immutable; is valid as declared in {@link #isValidNric(String)}
+ */
+public class Nric {
+
+ public static final String MESSAGE_CONSTRAINTS =
+ "Nric must be valid. ";
+
+ public static final String VALIDATION_REGEX = "^[A-Z]\\d{7}[A-Z]$";
+
+ public final String value;
+
+ /**
+ * Constructs a {@code Name}.
+ *
+ * @param value A valid Nric.
+ */
+ public Nric(String value) {
+ requireNonNull(value);
+ checkArgument(isValidNric(value), MESSAGE_CONSTRAINTS);
+ this.value = value;
+ }
+
+ /**
+ * Returns true if a given string is a valid name.
+ */
+ public static boolean isValidNric(String test) {
+ return test.matches(VALIDATION_REGEX);
+ }
+
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof Nric)) {
+ return false;
+ }
+
+ Nric otherNric = (Nric) other;
+ return value.equals(otherNric.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java
index abe8c46b535..b5caabb9049 100644
--- a/src/main/java/seedu/address/model/person/Person.java
+++ b/src/main/java/seedu/address/model/person/Person.java
@@ -11,29 +11,34 @@
import seedu.address.model.tag.Tag;
/**
- * Represents a Person in the address book.
+ * Represents a Person in the Med Logger.
* Guarantees: details are present and not null, field values are validated, immutable.
*/
public class Person {
// Identity fields
private final Name name;
+ private final Nric nric;
private final Phone phone;
private final Email email;
// Data fields
private final Address address;
+ private final Remark remark;
private final Set tags = new HashSet<>();
/**
* Every field must be present and not null.
*/
- public Person(Name name, Phone phone, Email email, Address address, Set tags) {
- requireAllNonNull(name, phone, email, address, tags);
+ public Person(Name name, Nric nric, Phone phone, Email email, Address address,
+ Remark remark, Set tags) {
+ requireAllNonNull(name, nric, phone, email, address, remark, tags);
this.name = name;
+ this.nric = nric;
this.phone = phone;
this.email = email;
this.address = address;
+ this.remark = remark;
this.tags.addAll(tags);
}
@@ -41,6 +46,10 @@ public Name getName() {
return name;
}
+ public Nric getNric() {
+ return nric;
+ }
+
public Phone getPhone() {
return phone;
}
@@ -53,6 +62,10 @@ public Address getAddress() {
return address;
}
+ public Remark getRemark() {
+ return remark;
+ }
+
/**
* Returns an immutable tag set, which throws {@code UnsupportedOperationException}
* if modification is attempted.
@@ -71,7 +84,23 @@ public boolean isSamePerson(Person otherPerson) {
}
return otherPerson != null
- && otherPerson.getName().equals(getName());
+ && otherPerson.getNric().equals(getNric());
+ }
+
+ /**
+ * Returns a dummy Person with default placeholder values for all fields
+ * except name and nric.
+ */
+ public static Person createDummyPerson(Nric nric) {
+ return new Person(
+ Name.DUMMY_NAME,
+ nric,
+ Phone.DUMMY_PHONE,
+ Email.DUMMY_EMAIL,
+ Address.DUMMY_ADDRESS,
+ new Remark(""),
+ new HashSet<>()
+ );
}
/**
@@ -91,6 +120,7 @@ public boolean equals(Object other) {
Person otherPerson = (Person) other;
return name.equals(otherPerson.name)
+ && nric.equals(otherPerson.nric)
&& phone.equals(otherPerson.phone)
&& email.equals(otherPerson.email)
&& address.equals(otherPerson.address)
@@ -100,13 +130,14 @@ public boolean equals(Object other) {
@Override
public int hashCode() {
// use this method for custom fields hashing instead of implementing your own
- return Objects.hash(name, phone, email, address, tags);
+ return Objects.hash(name, nric, phone, email, address, remark, tags);
}
@Override
public String toString() {
return new ToStringBuilder(this)
.add("name", name)
+ .add("NRIC", nric)
.add("phone", phone)
.add("email", email)
.add("address", address)
diff --git a/src/main/java/seedu/address/model/person/PersonVisitDictionary.java b/src/main/java/seedu/address/model/person/PersonVisitDictionary.java
new file mode 100644
index 00000000000..545d3174b72
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/PersonVisitDictionary.java
@@ -0,0 +1,133 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import seedu.address.model.person.exceptions.DuplicatePersonException;
+import seedu.address.model.person.exceptions.DuplicateVisitException;
+import seedu.address.model.person.exceptions.PersonNotFoundException;
+import seedu.address.model.person.exceptions.VisitNotFoundException;
+
+/**
+ * A dictionary that maps each person to their visits.
+ * Supports a minimal set of list operations.
+ */
+public class PersonVisitDictionary {
+ private final Map> personToVisits = new HashMap<>();
+
+ /**
+ * Replaces the contents of this map with {@code personsToVisits}.
+ */
+ public void setDictionary(Map> personToVisits) {
+ requireNonNull(personToVisits);
+ this.personToVisits.clear();
+ for (Map.Entry> entry : personToVisits.entrySet()) {
+ this.personToVisits.put(entry.getKey(), new ArrayList<>(entry.getValue()));
+ }
+ }
+
+ /**
+ * Adds a new person.
+ */
+ public void addPerson(Person person) {
+ requireNonNull(person);
+ if (personToVisits.containsKey(person)) {
+ throw new DuplicatePersonException();
+ }
+ personToVisits.put(person, new ArrayList<>());
+ }
+
+ /**
+ * Adds a visit to its attached person.
+ */
+ public void addVisit(Visit visit) {
+ requireNonNull(visit);
+ Person person = visit.getPerson();
+ if (!personToVisits.containsKey(person)) {
+ throw new PersonNotFoundException();
+ }
+ if (personToVisits.get(person).contains(visit)) {
+ throw new DuplicateVisitException();
+ }
+ personToVisits.get(person).add(visit);
+ }
+
+ public void setVisit(Visit target, Visit editedVisit) {
+ requireAllNonNull(target, editedVisit);
+ if (target.getPerson().equals(editedVisit.getPerson())) {
+ if (!personToVisits.containsKey(target.getPerson())) {
+ throw new PersonNotFoundException();
+ }
+ personToVisits.get(target.getPerson()).add(editedVisit);
+ personToVisits.get(target.getPerson()).remove(target);
+ } else {
+ if (!personToVisits.containsKey(target.getPerson())
+ || !personToVisits.containsKey(editedVisit.getPerson())) {
+ throw new PersonNotFoundException();
+ }
+ personToVisits.get(target.getPerson()).remove(target);
+ personToVisits.get(editedVisit.getPerson()).add(editedVisit);
+ }
+ }
+
+ /**
+ * Removes a visit.
+ */
+ public void removeVisit(Visit visit) {
+ requireNonNull(visit);
+ Person person = visit.getPerson();
+ if (!personToVisits.containsKey(person)) {
+ throw new PersonNotFoundException();
+ }
+ if (!personToVisits.get(person).contains(visit)) {
+ throw new VisitNotFoundException();
+ }
+ personToVisits.get(person).remove(visit);
+ }
+
+ /**
+ * Replaces a person with its edited version.
+ * Migrates their visits to the edited version.
+ */
+ public void setPerson(Person target, Person editedPerson) {
+ requireAllNonNull(target, editedPerson);
+ if (!personToVisits.containsKey(target)) {
+ throw new PersonNotFoundException();
+ }
+ List targetPersonVisits = personToVisits.get(target);
+ personToVisits.remove(target);
+ addPerson(editedPerson);
+ for (Visit visit : targetPersonVisits) {
+ personToVisits.get(editedPerson).add(visit.withPerson(editedPerson));
+ }
+ }
+
+ /**
+ * Removes a person together with their visits.
+ */
+ public void removePerson(Person person) {
+ requireNonNull(person);
+ if (!personToVisits.containsKey(person)) {
+ throw new PersonNotFoundException();
+ }
+ personToVisits.remove(person);
+ }
+
+ public List getVisitsForPerson(Person person) {
+ requireNonNull(person);
+ return Collections.unmodifiableList(
+ personToVisits.getOrDefault(person, Collections.emptyList())
+ );
+ }
+
+ public Map> getDictionary() {
+ return Collections.unmodifiableMap(this.personToVisits);
+ }
+}
+
diff --git a/src/main/java/seedu/address/model/person/Phone.java b/src/main/java/seedu/address/model/person/Phone.java
index d733f63d739..774b0065249 100644
--- a/src/main/java/seedu/address/model/person/Phone.java
+++ b/src/main/java/seedu/address/model/person/Phone.java
@@ -4,15 +4,16 @@
import static seedu.address.commons.util.AppUtil.checkArgument;
/**
- * Represents a Person's phone number in the address book.
+ * Represents a Person's phone number in the Med Logger.
* Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)}
*/
public class Phone {
public static final String MESSAGE_CONSTRAINTS =
- "Phone numbers should only contain numbers, and it should be at least 3 digits long";
- public static final String VALIDATION_REGEX = "\\d{3,}";
+ "Singapore Phone numbers should contain eight digits with first digit being 6, 8 or 9. ";
+ public static final String VALIDATION_REGEX = "^[689]\\d{7}$";
+ public static final Phone DUMMY_PHONE = new Phone("98765432");
public final String value;
/**
diff --git a/src/main/java/seedu/address/model/person/Remark.java b/src/main/java/seedu/address/model/person/Remark.java
new file mode 100644
index 00000000000..bec49b6f205
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/Remark.java
@@ -0,0 +1,37 @@
+
+package seedu.address.model.person;
+
+/**
+ * Represents a Person's remark in the address book.
+ * Guarantees: immutable; is always valid
+ */
+public class Remark {
+ public final String value;
+
+ /**
+ * Constructs a {@code Remark} with the specified remark value.
+ *
+ * @param remark The text content of the remark.
+ */
+ public Remark(String remark) {
+ // requireNonNull(remark);
+ value = remark;
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other == this // short circuit if same object
+ || (other instanceof Remark // instanceof handles nulls
+ && value.equals(((Remark) other).value)); // state check
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/Symptom.java b/src/main/java/seedu/address/model/person/Symptom.java
new file mode 100644
index 00000000000..735552038e5
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/Symptom.java
@@ -0,0 +1,40 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Represents the patient's symptom.
+ */
+public class Symptom {
+ public final String value;
+
+ /**
+ * Constructs a {@code Symptom}.
+ * @param value some symptom.
+ */
+ public Symptom(String value) {
+ requireNonNull(value);
+ this.value = value;
+ }
+
+ public String toLowerCase() {
+ return value.toLowerCase();
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other == this
+ || (other instanceof Symptom
+ && value.equals(((Symptom) other).value));
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/UniquePersonList.java b/src/main/java/seedu/address/model/person/UniquePersonList.java
index cc0a68d79f9..c3335b7156a 100644
--- a/src/main/java/seedu/address/model/person/UniquePersonList.java
+++ b/src/main/java/seedu/address/model/person/UniquePersonList.java
@@ -3,8 +3,10 @@
import static java.util.Objects.requireNonNull;
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Optional;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
@@ -27,6 +29,7 @@ public class UniquePersonList implements Iterable {
private final ObservableList internalList = FXCollections.observableArrayList();
private final ObservableList internalUnmodifiableList =
FXCollections.unmodifiableObservableList(internalList);
+ private final HashMap personMap = new HashMap<>();
/**
* Returns true if the list contains an equivalent person as the given argument.
@@ -46,6 +49,7 @@ public void add(Person toAdd) {
throw new DuplicatePersonException();
}
internalList.add(toAdd);
+ personMap.put(toAdd.getNric().toString(), toAdd);
}
/**
@@ -66,6 +70,8 @@ public void setPerson(Person target, Person editedPerson) {
}
internalList.set(index, editedPerson);
+ personMap.remove(target.getNric().toString());
+ personMap.put(editedPerson.getNric().toString(), editedPerson);
}
/**
@@ -77,11 +83,14 @@ public void remove(Person toRemove) {
if (!internalList.remove(toRemove)) {
throw new PersonNotFoundException();
}
+ personMap.remove(toRemove.getNric().toString());
}
public void setPersons(UniquePersonList replacement) {
requireNonNull(replacement);
internalList.setAll(replacement.internalList);
+ personMap.clear();
+ personMap.putAll(replacement.personMap);
}
/**
@@ -93,8 +102,11 @@ public void setPersons(List persons) {
if (!personsAreUnique(persons)) {
throw new DuplicatePersonException();
}
-
internalList.setAll(persons);
+ personMap.clear();
+ for (Person person : persons) {
+ personMap.put(person.getNric().value, person);
+ }
}
/**
@@ -147,4 +159,14 @@ private boolean personsAreUnique(List persons) {
}
return true;
}
+
+ /**
+ * Retrieves a {@code Person} with the specified NRIC.
+ * If a {@code Person} is found, it is returned wrapped in an
+ * {@code Optional}; otherwise, an empty {@code Optional} is returned.
+ */
+ public Optional getPersonByNric(Nric nric) {
+ requireNonNull(nric);
+ return Optional.ofNullable(personMap.get(nric.toString()));
+ }
}
diff --git a/src/main/java/seedu/address/model/person/UniqueVisitList.java b/src/main/java/seedu/address/model/person/UniqueVisitList.java
new file mode 100644
index 00000000000..7c60e9d3b25
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/UniqueVisitList.java
@@ -0,0 +1,144 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+
+import java.util.Iterator;
+import java.util.List;
+
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import seedu.address.model.person.exceptions.DuplicateVisitException;
+import seedu.address.model.person.exceptions.PersonNotFoundException;
+import seedu.address.model.person.exceptions.VisitNotFoundException;
+
+/**
+ * A list of visits that enforces uniqueness between its elements and does not allow nulls.
+ * A visit is considered unique by comparing using {@code Visit#equals(Object)}. As such, adding and updating of
+ * visits uses Visit#equals(Object) for equality to ensure that the visit being added or updated is
+ * unique in terms of identity in the UniqueVisitList.
+ *
+ * Supports a minimal set of list operations.
+ *
+ * @see Visit#equals(Object)
+ */
+public class UniqueVisitList implements Iterable {
+
+ private final ObservableList internalList = FXCollections.observableArrayList();
+ private final ObservableList internalUnmodifiableList =
+ FXCollections.unmodifiableObservableList(internalList);
+
+ /**
+ * Returns true if the list contains an equivalent visit as the given argument.
+ */
+ public boolean contains(Visit toCheck) {
+ requireNonNull(toCheck);
+ return internalList.stream().anyMatch(toCheck::equals);
+ }
+
+ /**
+ * Adds a visit to the list.
+ */
+ public void add(Visit toAdd) {
+ requireNonNull(toAdd);
+ if (contains(toAdd)) {
+ throw new DuplicateVisitException();
+ }
+ internalList.add(toAdd);
+ }
+
+ /**
+ * Replaces the visit {@code target} in the list with {@code editedVisit}.
+ * {@code target} must exist in the list.
+ * The {@code editedVisit} must not be the same as another existing visit in the list.
+ */
+ public void setVisit(Visit target, Visit editedVisit) {
+ requireAllNonNull(target, editedVisit);
+
+ int index = internalList.indexOf(target);
+ if (index == -1) {
+ throw new VisitNotFoundException();
+ }
+
+ if (!target.equals(editedVisit) && contains(editedVisit)) {
+ throw new DuplicateVisitException();
+ }
+
+ internalList.set(index, editedVisit);
+ }
+
+ /**
+ * Removes the equivalent visit from the list.
+ * The viist must exist in the list.
+ */
+ public void remove(Visit toRemove) {
+ requireNonNull(toRemove);
+ if (!internalList.remove(toRemove)) {
+ throw new PersonNotFoundException();
+ }
+ }
+
+ /**
+ * Replaces the contents of this list with {@code visits}.
+ * {@code visits} must not contain duplicate visits.
+ */
+ public void setVisits(List visits) {
+ requireAllNonNull(visits);
+ if (!visitsAreUnique(visits)) {
+ throw new DuplicateVisitException();
+ }
+
+ internalList.setAll(visits);
+ }
+
+ /**
+ * Returns the backing list as an unmodifiable {@code ObservableList}.
+ */
+ public ObservableList asUnmodifiableObservableList() {
+ return internalUnmodifiableList;
+ }
+
+ @Override
+ public Iterator iterator() {
+ return internalList.iterator();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof UniquePersonList)) {
+ return false;
+ }
+
+ UniqueVisitList otherVisitList = (UniqueVisitList) other;
+ return internalList.equals(otherVisitList.internalList);
+ }
+
+ @Override
+ public int hashCode() {
+ return internalList.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return internalList.toString();
+ }
+
+ /**
+ * Returns true if {@code visits} contains only unique visits.
+ */
+ private boolean visitsAreUnique(List visits) {
+ for (int i = 0; i < visits.size() - 1; i++) {
+ for (int j = i + 1; j < visits.size(); j++) {
+ if (visits.get(i).equals(visits.get(j))) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/Visit.java b/src/main/java/seedu/address/model/person/Visit.java
new file mode 100644
index 00000000000..e524ccf951c
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/Visit.java
@@ -0,0 +1,106 @@
+package seedu.address.model.person;
+
+import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+
+import seedu.address.commons.util.ToStringBuilder;
+
+/**
+ * Represents a Visit of a particular Person.
+ * Guarantees: details are present and not null, field values are validated, immutable.
+ */
+public class Visit {
+ // Visit details: who, when, why, how
+ private final Person person;
+ private final DateTime dateTime;
+ private final Remark remark;
+ private final Symptom symptom;
+ private final Diagnosis diagnosis;
+ private final Medication medication;
+ private final FollowUp followUp;
+
+ /**
+ * Every parameter must present and be non-null.
+ * @param person
+ * @param dateTime
+ * @param remark
+ */
+ public Visit(Person person, DateTime dateTime, Remark remark,
+ Symptom symptom, Diagnosis diagnosis,
+ Medication medication, FollowUp followUp) {
+ requireAllNonNull(person, remark, symptom, diagnosis, medication, followUp);
+ this.person = person;
+ this.dateTime = (dateTime != null) ? dateTime : DateTime.now();
+ this.remark = remark;
+ this.symptom = symptom;
+ this.diagnosis = diagnosis;
+ this.medication = medication;
+ this.followUp = followUp;
+ }
+
+ public Person getPerson() {
+ return person;
+ }
+
+ public Nric getNric() {
+ return person.getNric();
+ }
+
+ public DateTime getDateTime() {
+ return dateTime;
+ }
+
+ public Remark getRemark() {
+ return remark;
+ }
+
+ public Symptom getSymptom() {
+ return symptom;
+ }
+
+ public Diagnosis getDiagnosis() {
+ return diagnosis;
+ }
+
+ public Medication getMedication() {
+ return medication;
+ }
+
+ public FollowUp getFollowUp() {
+ return followUp;
+ }
+
+ public Visit withPerson(Person newPerson) {
+ return new Visit(newPerson, dateTime, remark, symptom, diagnosis, medication, followUp);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+ if (!(other instanceof Visit)) {
+ return false;
+ }
+ Visit o = (Visit) other;
+ return person.equals(o.person)
+ && dateTime.equals(o.dateTime)
+ && remark.equals(o.remark)
+ && symptom.equals(o.symptom)
+ && diagnosis.equals(o.diagnosis)
+ && medication.equals(o.medication)
+ && followUp.equals(o.followUp);
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .add("person", person)
+ .add("dateTime", dateTime)
+ .add("remark", remark)
+ .add("symptom", symptom)
+ .add("diagnosis", diagnosis)
+ .add("medication", medication)
+ .add("followUp", followUp)
+ .toString();
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/exceptions/DuplicateVisitException.java b/src/main/java/seedu/address/model/person/exceptions/DuplicateVisitException.java
new file mode 100644
index 00000000000..f27da099b76
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/exceptions/DuplicateVisitException.java
@@ -0,0 +1,10 @@
+package seedu.address.model.person.exceptions;
+
+/**
+ * Signals that the operation will result in duplicate Visit
+ */
+public class DuplicateVisitException extends RuntimeException {
+ public DuplicateVisitException() {
+ super("Operation would result in duplicate visits");
+ }
+}
diff --git a/src/main/java/seedu/address/model/person/exceptions/VisitNotFoundException.java b/src/main/java/seedu/address/model/person/exceptions/VisitNotFoundException.java
new file mode 100644
index 00000000000..6e9e2cf69bc
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/exceptions/VisitNotFoundException.java
@@ -0,0 +1,6 @@
+package seedu.address.model.person.exceptions;
+
+/**
+ * Signals that the operation is unable to find the specified visit.
+ */
+public class VisitNotFoundException extends RuntimeException {}
diff --git a/src/main/java/seedu/address/model/tag/Tag.java b/src/main/java/seedu/address/model/tag/Tag.java
index f1a0d4e233b..144ec473a37 100644
--- a/src/main/java/seedu/address/model/tag/Tag.java
+++ b/src/main/java/seedu/address/model/tag/Tag.java
@@ -4,13 +4,14 @@
import static seedu.address.commons.util.AppUtil.checkArgument;
/**
- * Represents a Tag in the address book.
+ * Represents a Tag in the Med Logger.
* Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)}
*/
public class Tag {
public static final String MESSAGE_CONSTRAINTS = "Tags names should be alphanumeric";
public static final String VALIDATION_REGEX = "\\p{Alnum}+";
+ public static final Tag DUMMY_TAG = new Tag("dummyTag");
public final String tagName;
diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java
index 1806da4facf..779a895ca55 100644
--- a/src/main/java/seedu/address/model/util/SampleDataUtil.java
+++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java
@@ -4,44 +4,49 @@
import java.util.Set;
import java.util.stream.Collectors;
-import seedu.address.model.AddressBook;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.MedLogger;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
/**
- * Contains utility methods for populating {@code AddressBook} with sample data.
+ * Contains utility methods for populating {@code MedLogger} with sample data.
*/
public class SampleDataUtil {
+
+ public static final Remark EMPTY_REMARK = new Remark("");
+
public static Person[] getSamplePersons() {
return new Person[] {
- new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"),
- new Address("Blk 30 Geylang Street 29, #06-40"),
+ new Person(new Name("Alex Yeoh"), new Nric("S1234567A"), new Phone("87438807"),
+ new Email("alexyeoh@example.com"), new Address("Blk 30 Geylang Street 29, #06-40"), EMPTY_REMARK,
getTagSet("friends")),
- new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"),
- new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"),
- getTagSet("colleagues", "friends")),
- new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"),
- new Address("Blk 11 Ang Mo Kio Street 74, #11-04"),
+ new Person(new Name("Bernice Yu"), new Nric("S7123456A"), new Phone("99272758"),
+ new Email("berniceyu@example.com"), new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"),
+ EMPTY_REMARK, getTagSet("colleagues", "friends")),
+ new Person(new Name("Charlotte Oliveiro"), new Nric("S6712345A"), new Phone("93210283"),
+ new Email("charlotte@example.com"), new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), EMPTY_REMARK,
getTagSet("neighbours")),
- new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"),
- new Address("Blk 436 Serangoon Gardens Street 26, #16-43"),
- getTagSet("family")),
- new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"),
- new Address("Blk 47 Tampines Street 20, #17-35"),
+ new Person(new Name("David Li"), new Nric("S5671234A"), new Phone("91031282"),
+ new Email("lidavid@example.com"), new Address("Blk 436 Serangoon Gardens Street 26, #16-43"),
+ EMPTY_REMARK, getTagSet("family")),
+ new Person(new Name("Irfan Ibrahim"), new Nric("S4567123A"), new Phone("92492021"),
+ new Email("irfan@example.com"), new Address("Blk 47 Tampines Street 20, #17-35"), EMPTY_REMARK,
getTagSet("classmates")),
- new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"),
- new Address("Blk 45 Aljunied Street 85, #11-31"),
+ new Person(new Name("Roy Balakrishnan"), new Nric("S3456712A"), new Phone("92624417"),
+ new Email("royb@example.com"), new Address("Blk 45 Aljunied Street 85, #11-31"), EMPTY_REMARK,
getTagSet("colleagues"))
};
}
- public static ReadOnlyAddressBook getSampleAddressBook() {
- AddressBook sampleAb = new AddressBook();
+ public static ReadOnlyMedLogger getSampleMedLogger() {
+ MedLogger sampleAb = new MedLogger();
for (Person samplePerson : getSamplePersons()) {
sampleAb.addPerson(samplePerson);
}
diff --git a/src/main/java/seedu/address/storage/AddressBookStorage.java b/src/main/java/seedu/address/storage/AddressBookStorage.java
deleted file mode 100644
index f2e015105ae..00000000000
--- a/src/main/java/seedu/address/storage/AddressBookStorage.java
+++ /dev/null
@@ -1,45 +0,0 @@
-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.ReadOnlyAddressBook;
-
-/**
- * Represents a storage for {@link seedu.address.model.AddressBook}.
- */
-public interface AddressBookStorage {
-
- /**
- * Returns the file path of the data file.
- */
- Path getAddressBookFilePath();
-
- /**
- * Returns AddressBook data as a {@link ReadOnlyAddressBook}.
- * Returns {@code Optional.empty()} if storage file is not found.
- *
- * @throws DataLoadingException if loading the data from storage failed.
- */
- Optional readAddressBook() throws DataLoadingException;
-
- /**
- * @see #getAddressBookFilePath()
- */
- Optional readAddressBook(Path filePath) throws DataLoadingException;
-
- /**
- * Saves the given {@link ReadOnlyAddressBook} to the storage.
- * @param addressBook cannot be null.
- * @throws IOException if there was any problem writing to the file.
- */
- void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;
-
- /**
- * @see #saveAddressBook(ReadOnlyAddressBook)
- */
- void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException;
-
-}
diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
index bd1ca0f56c8..d889c7d0315 100644
--- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
+++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
@@ -13,8 +13,10 @@
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
/**
@@ -25,22 +27,27 @@ class JsonAdaptedPerson {
public static final String MISSING_FIELD_MESSAGE_FORMAT = "Person's %s field is missing!";
private final String name;
+ private final String nric;
private final String phone;
private final String email;
private final String address;
+ private final String remark;
private final List tags = new ArrayList<>();
/**
* Constructs a {@code JsonAdaptedPerson} with the given person details.
*/
@JsonCreator
- public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone,
- @JsonProperty("email") String email, @JsonProperty("address") String address,
- @JsonProperty("tags") List tags) {
+ public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("NRIC") String nric,
+ @JsonProperty("phone") String phone, @JsonProperty("email") String email,
+ @JsonProperty("address") String address,
+ @JsonProperty("remark") String remark, @JsonProperty("tags") List tags) {
this.name = name;
+ this.nric = nric;
this.phone = phone;
this.email = email;
this.address = address;
+ this.remark = remark;
if (tags != null) {
this.tags.addAll(tags);
}
@@ -51,9 +58,11 @@ public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone
*/
public JsonAdaptedPerson(Person source) {
name = source.getName().fullName;
+ nric = source.getNric().value;
phone = source.getPhone().value;
email = source.getEmail().value;
address = source.getAddress().value;
+ remark = source.getRemark().value;
tags.addAll(source.getTags().stream()
.map(JsonAdaptedTag::new)
.collect(Collectors.toList()));
@@ -78,6 +87,14 @@ public Person toModelType() throws IllegalValueException {
}
final Name modelName = new Name(name);
+ if (nric == null) {
+ throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Nric.class.getSimpleName()));
+ }
+ if (!Nric.isValidNric(nric)) {
+ throw new IllegalValueException(Nric.MESSAGE_CONSTRAINTS);
+ }
+ final Nric modelNric = new Nric(nric);
+
if (phone == null) {
throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));
}
@@ -102,8 +119,13 @@ public Person toModelType() throws IllegalValueException {
}
final Address modelAddress = new Address(address);
+ if (remark == null) {
+ throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Remark.class.getSimpleName()));
+ }
+ final Remark modelRemark = new Remark(remark);
+
final Set modelTags = new HashSet<>(personTags);
- return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);
+ return new Person(modelName, modelNric, modelPhone, modelEmail, modelAddress, modelRemark, modelTags);
}
}
diff --git a/src/main/java/seedu/address/storage/JsonAdaptedVisit.java b/src/main/java/seedu/address/storage/JsonAdaptedVisit.java
new file mode 100644
index 00000000000..9f730fa0e58
--- /dev/null
+++ b/src/main/java/seedu/address/storage/JsonAdaptedVisit.java
@@ -0,0 +1,107 @@
+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.person.DateTime;
+import seedu.address.model.person.Diagnosis;
+import seedu.address.model.person.FollowUp;
+import seedu.address.model.person.Medication;
+import seedu.address.model.person.Nric;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Remark;
+import seedu.address.model.person.Symptom;
+import seedu.address.model.person.Visit;
+
+/**
+ * Jackson-friendly version of {@link Visit}.
+ */
+class JsonAdaptedVisit {
+
+ public static final String MISSING_FIELD_MESSAGE_FORMAT = "Visit's %s field is missing!";
+
+ private final String nric;
+ private final String dateTime;
+ private final String remark;
+
+ private final String symptom;
+ private final String diagnosis;
+ private final String medication;
+ private final String followUp;
+
+ /**
+ * Constructs a {@code JsonAdaptedVisit} with the given visit details.
+ */
+ @JsonCreator
+ public JsonAdaptedVisit(@JsonProperty("NRIC") String nric,
+ @JsonProperty("dateTime") String dateTime,
+ @JsonProperty("remark") String remark,
+ @JsonProperty("symptom") String symptom,
+ @JsonProperty("diagnosis") String diagnosis,
+ @JsonProperty("medication") String medication,
+ @JsonProperty("followUp") String followUp) {
+ this.nric = nric;
+ this.dateTime = dateTime;
+ this.remark = remark;
+ this.symptom = symptom;
+ this.diagnosis = diagnosis;
+ this.medication = medication;
+ this.followUp = followUp;
+ }
+
+ /**
+ * Converts a given {@code Visit} into this class for Jackson use.
+ */
+ public JsonAdaptedVisit(Visit source) {
+ nric = source.getNric().value;
+ dateTime = source.getDateTime().value;
+ remark = source.getRemark().value;
+ symptom = source.getSymptom().value;
+ diagnosis = source.getDiagnosis().value;
+ medication = source.getMedication().value;
+ followUp = source.getFollowUp().value;
+ }
+
+ public Nric getNric() throws IllegalValueException {
+ if (nric == null) {
+ throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Nric.class.getSimpleName()));
+ }
+ if (!Nric.isValidNric(nric)) {
+ throw new IllegalValueException(Nric.MESSAGE_CONSTRAINTS);
+ }
+ return new Nric(nric);
+ }
+
+ /**
+ * Converts this Jackson-friendly adapted visit object into the model's {@code Visit} object.
+ *
+ * @throws IllegalValueException if there were any data constraints violated in the adapted visit.
+ */
+ public Visit toModelType(Person person) throws IllegalValueException {
+ // Handle dateTime
+ final DateTime modelDateTime;
+ if (dateTime == null) {
+ modelDateTime = DateTime.now();
+ } else if (!DateTime.isValidDate(dateTime)) {
+ throw new IllegalValueException(DateTime.MESSAGE_CONSTRAINTS);
+ } else {
+ modelDateTime = new DateTime(dateTime);
+ }
+
+ // Handle remark
+ if (remark == null) {
+ throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Remark.class.getSimpleName()));
+ }
+ final Remark modelRemark = new Remark(remark);
+
+ // Handle optional fields with fallback
+ final Symptom modelSymptom = new Symptom(symptom != null ? symptom : "");
+ final Diagnosis modelDiagnosis = new Diagnosis(diagnosis != null ? diagnosis : "");
+ final Medication modelMedication = new Medication(medication != null ? medication : "");
+ final FollowUp modelFollowUp = new FollowUp(followUp != null ? followUp : "");
+
+ return new Visit(person, modelDateTime, modelRemark,
+ modelSymptom, modelDiagnosis, modelMedication, modelFollowUp);
+ }
+}
diff --git a/src/main/java/seedu/address/storage/JsonAddressBookStorage.java b/src/main/java/seedu/address/storage/JsonMedLoggerStorage.java
similarity index 50%
rename from src/main/java/seedu/address/storage/JsonAddressBookStorage.java
rename to src/main/java/seedu/address/storage/JsonMedLoggerStorage.java
index 41e06f264e1..44f48570e80 100644
--- a/src/main/java/seedu/address/storage/JsonAddressBookStorage.java
+++ b/src/main/java/seedu/address/storage/JsonMedLoggerStorage.java
@@ -12,47 +12,47 @@
import seedu.address.commons.exceptions.IllegalValueException;
import seedu.address.commons.util.FileUtil;
import seedu.address.commons.util.JsonUtil;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyMedLogger;
/**
- * A class to access AddressBook data stored as a json file on the hard disk.
+ * A class to access MedLogger data stored as a json file on the hard disk.
*/
-public class JsonAddressBookStorage implements AddressBookStorage {
+public class JsonMedLoggerStorage implements MedLoggerStorage {
- private static final Logger logger = LogsCenter.getLogger(JsonAddressBookStorage.class);
+ private static final Logger logger = LogsCenter.getLogger(JsonMedLoggerStorage.class);
private Path filePath;
- public JsonAddressBookStorage(Path filePath) {
+ public JsonMedLoggerStorage(Path filePath) {
this.filePath = filePath;
}
- public Path getAddressBookFilePath() {
+ public Path getMedLoggerFilePath() {
return filePath;
}
@Override
- public Optional readAddressBook() throws DataLoadingException {
- return readAddressBook(filePath);
+ public Optional readMedLogger() throws DataLoadingException {
+ return readMedLogger(filePath);
}
/**
- * Similar to {@link #readAddressBook()}.
+ * Similar to {@link #readMedLogger()}.
*
* @param filePath location of the data. Cannot be null.
* @throws DataLoadingException if loading the data from storage failed.
*/
- public Optional readAddressBook(Path filePath) throws DataLoadingException {
+ public Optional readMedLogger(Path filePath) throws DataLoadingException {
requireNonNull(filePath);
- Optional jsonAddressBook = JsonUtil.readJsonFile(
- filePath, JsonSerializableAddressBook.class);
- if (!jsonAddressBook.isPresent()) {
+ Optional jsonMedLogger = JsonUtil.readJsonFile(
+ filePath, JsonSerializableMedLogger.class);
+ if (!jsonMedLogger.isPresent()) {
return Optional.empty();
}
try {
- return Optional.of(jsonAddressBook.get().toModelType());
+ return Optional.of(jsonMedLogger.get().toModelType());
} catch (IllegalValueException ive) {
logger.info("Illegal values found in " + filePath + ": " + ive.getMessage());
throw new DataLoadingException(ive);
@@ -60,21 +60,21 @@ public Optional readAddressBook(Path filePath) throws DataL
}
@Override
- public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {
- saveAddressBook(addressBook, filePath);
+ public void saveMedLogger(ReadOnlyMedLogger medLogger) throws IOException {
+ saveMedLogger(medLogger, filePath);
}
/**
- * Similar to {@link #saveAddressBook(ReadOnlyAddressBook)}.
+ * Similar to {@link #saveMedLogger(ReadOnlyMedLogger)}.
*
* @param filePath location of the data. Cannot be null.
*/
- public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {
- requireNonNull(addressBook);
+ public void saveMedLogger(ReadOnlyMedLogger medLogger, Path filePath) throws IOException {
+ requireNonNull(medLogger);
requireNonNull(filePath);
FileUtil.createIfMissing(filePath);
- JsonUtil.saveJsonFile(new JsonSerializableAddressBook(addressBook), filePath);
+ JsonUtil.saveJsonFile(new JsonSerializableMedLogger(medLogger), filePath);
}
}
diff --git a/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java b/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java
deleted file mode 100644
index 5efd834091d..00000000000
--- a/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java
+++ /dev/null
@@ -1,60 +0,0 @@
-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.AddressBook;
-import seedu.address.model.ReadOnlyAddressBook;
-import seedu.address.model.person.Person;
-
-/**
- * An Immutable AddressBook that is serializable to JSON format.
- */
-@JsonRootName(value = "addressbook")
-class JsonSerializableAddressBook {
-
- public static final String MESSAGE_DUPLICATE_PERSON = "Persons list contains duplicate person(s).";
-
- private final List persons = new ArrayList<>();
-
- /**
- * Constructs a {@code JsonSerializableAddressBook} with the given persons.
- */
- @JsonCreator
- public JsonSerializableAddressBook(@JsonProperty("persons") List persons) {
- this.persons.addAll(persons);
- }
-
- /**
- * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.
- *
- * @param source future changes to this will not affect the created {@code JsonSerializableAddressBook}.
- */
- public JsonSerializableAddressBook(ReadOnlyAddressBook source) {
- persons.addAll(source.getPersonList().stream().map(JsonAdaptedPerson::new).collect(Collectors.toList()));
- }
-
- /**
- * Converts this address book into the model's {@code AddressBook} object.
- *
- * @throws IllegalValueException if there were any data constraints violated.
- */
- public AddressBook toModelType() throws IllegalValueException {
- AddressBook addressBook = new AddressBook();
- for (JsonAdaptedPerson jsonAdaptedPerson : persons) {
- Person person = jsonAdaptedPerson.toModelType();
- if (addressBook.hasPerson(person)) {
- throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON);
- }
- addressBook.addPerson(person);
- }
- return addressBook;
- }
-
-}
diff --git a/src/main/java/seedu/address/storage/JsonSerializableMedLogger.java b/src/main/java/seedu/address/storage/JsonSerializableMedLogger.java
new file mode 100644
index 00000000000..75be963f3e8
--- /dev/null
+++ b/src/main/java/seedu/address/storage/JsonSerializableMedLogger.java
@@ -0,0 +1,84 @@
+package seedu.address.storage;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+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.MedLogger;
+import seedu.address.model.ReadOnlyMedLogger;
+import seedu.address.model.person.Nric;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Visit;
+
+/**
+ * An Immutable MedLogger that is serializable to JSON format.
+ */
+@JsonRootName(value = "addressddbook")
+class JsonSerializableMedLogger {
+
+ public static final String MESSAGE_DUPLICATE_PERSON = "Persons list contains duplicate person(s).";
+ public static final String MESSAGE_DUPLICATE_VISIT = "Visits list contains duplicate visit(s).";
+ public static final String MESSAGE_NO_PERSON = "Some visits have no associated person(s).";
+
+ private final List persons = new ArrayList<>();
+ private final List visits = new ArrayList<>();
+
+ /**
+ * Constructs a {@code JsonSerializableMedLogger} with the given persons.
+ */
+ @JsonCreator
+ public JsonSerializableMedLogger(@JsonProperty("persons") List persons,
+ @JsonProperty("visits") List visits) {
+ this.persons.addAll(persons);
+ this.visits.addAll(visits);
+ }
+
+ /**
+ * Converts a given {@code ReadOnlyMedLogger} into this class for Jackson use.
+ *
+ * @param source future changes to this will not affect the created {@code JsonSerializableMedLogger}.
+ */
+ public JsonSerializableMedLogger(ReadOnlyMedLogger source) {
+ persons.addAll(source.getPersonList().stream().map(JsonAdaptedPerson::new).collect(Collectors.toList()));
+ visits.addAll(source.getVisitList().stream().map(JsonAdaptedVisit::new).collect(Collectors.toList()));
+ }
+
+ /**
+ * Converts this Med Logger into the model's {@code MedLogger} object.
+ *
+ * @throws IllegalValueException if there were any data constraints violated.
+ */
+ public MedLogger toModelType() throws IllegalValueException {
+ MedLogger medLogger = new MedLogger();
+
+ for (JsonAdaptedPerson jsonAdaptedPerson : persons) {
+ Person person = jsonAdaptedPerson.toModelType();
+ if (medLogger.hasPerson(person)) {
+ throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON);
+ }
+ medLogger.addPerson(person);
+ }
+
+ for (JsonAdaptedVisit jsonAdaptedVisit : visits) {
+ Nric nric = jsonAdaptedVisit.getNric();
+ Optional optionalPerson = medLogger.getPersonByNric(nric);
+ if (optionalPerson.isEmpty()) {
+ throw new IllegalValueException(MESSAGE_NO_PERSON);
+ }
+ Visit visit = jsonAdaptedVisit.toModelType(optionalPerson.get());
+ if (medLogger.hasVisit(visit)) {
+ throw new IllegalValueException(MESSAGE_DUPLICATE_VISIT);
+ }
+ medLogger.addVisit(visit);
+ }
+
+ return medLogger;
+ }
+
+}
diff --git a/src/main/java/seedu/address/storage/MedLoggerStorage.java b/src/main/java/seedu/address/storage/MedLoggerStorage.java
new file mode 100644
index 00000000000..146a4f801d4
--- /dev/null
+++ b/src/main/java/seedu/address/storage/MedLoggerStorage.java
@@ -0,0 +1,46 @@
+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.MedLogger;
+import seedu.address.model.ReadOnlyMedLogger;
+
+/**
+ * Represents a storage for {@link MedLogger}.
+ */
+public interface MedLoggerStorage {
+
+ /**
+ * Returns the file path of the data file.
+ */
+ Path getMedLoggerFilePath();
+
+ /**
+ * Returns MedLogger data as a {@link ReadOnlyMedLogger}.
+ * Returns {@code Optional.empty()} if storage file is not found.
+ *
+ * @throws DataLoadingException if loading the data from storage failed.
+ */
+ Optional readMedLogger() throws DataLoadingException;
+
+ /**
+ * @see #getMedLoggerFilePath()
+ */
+ Optional readMedLogger(Path filePath) throws DataLoadingException;
+
+ /**
+ * Saves the given {@link ReadOnlyMedLogger} to the storage.
+ * @param medLogger cannot be null.
+ * @throws IOException if there was any problem writing to the file.
+ */
+ void saveMedLogger(ReadOnlyMedLogger medLogger) throws IOException;
+
+ /**
+ * @see #saveMedLogger(ReadOnlyMedLogger)
+ */
+ void saveMedLogger(ReadOnlyMedLogger medLogger, Path filePath) throws IOException;
+
+}
diff --git a/src/main/java/seedu/address/storage/Storage.java b/src/main/java/seedu/address/storage/Storage.java
index 9fba0c7a1d6..f981e264384 100644
--- a/src/main/java/seedu/address/storage/Storage.java
+++ b/src/main/java/seedu/address/storage/Storage.java
@@ -5,14 +5,14 @@
import java.util.Optional;
import seedu.address.commons.exceptions.DataLoadingException;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.ReadOnlyUserPrefs;
import seedu.address.model.UserPrefs;
/**
* API of the Storage component
*/
-public interface Storage extends AddressBookStorage, UserPrefsStorage {
+public interface Storage extends MedLoggerStorage, UserPrefsStorage {
@Override
Optional readUserPrefs() throws DataLoadingException;
@@ -21,12 +21,12 @@ public interface Storage extends AddressBookStorage, UserPrefsStorage {
void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException;
@Override
- Path getAddressBookFilePath();
+ Path getMedLoggerFilePath();
@Override
- Optional readAddressBook() throws DataLoadingException;
+ Optional readMedLogger() throws DataLoadingException;
@Override
- void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;
+ void saveMedLogger(ReadOnlyMedLogger medLogger) throws IOException;
}
diff --git a/src/main/java/seedu/address/storage/StorageManager.java b/src/main/java/seedu/address/storage/StorageManager.java
index 8b84a9024d5..bcfaa34718d 100644
--- a/src/main/java/seedu/address/storage/StorageManager.java
+++ b/src/main/java/seedu/address/storage/StorageManager.java
@@ -7,24 +7,24 @@
import seedu.address.commons.core.LogsCenter;
import seedu.address.commons.exceptions.DataLoadingException;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.ReadOnlyUserPrefs;
import seedu.address.model.UserPrefs;
/**
- * Manages storage of AddressBook data in local storage.
+ * Manages storage of MedLogger data in local storage.
*/
public class StorageManager implements Storage {
private static final Logger logger = LogsCenter.getLogger(StorageManager.class);
- private AddressBookStorage addressBookStorage;
+ private MedLoggerStorage medLoggerStorage;
private UserPrefsStorage userPrefsStorage;
/**
- * Creates a {@code StorageManager} with the given {@code AddressBookStorage} and {@code UserPrefStorage}.
+ * Creates a {@code StorageManager} with the given {@code MedLoggerStorage} and {@code UserPrefStorage}.
*/
- public StorageManager(AddressBookStorage addressBookStorage, UserPrefsStorage userPrefsStorage) {
- this.addressBookStorage = addressBookStorage;
+ public StorageManager(MedLoggerStorage medLoggerStorage, UserPrefsStorage userPrefsStorage) {
+ this.medLoggerStorage = medLoggerStorage;
this.userPrefsStorage = userPrefsStorage;
}
@@ -46,33 +46,33 @@ public void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException {
}
- // ================ AddressBook methods ==============================
+ // ================ MedLogger methods ==============================
@Override
- public Path getAddressBookFilePath() {
- return addressBookStorage.getAddressBookFilePath();
+ public Path getMedLoggerFilePath() {
+ return medLoggerStorage.getMedLoggerFilePath();
}
@Override
- public Optional readAddressBook() throws DataLoadingException {
- return readAddressBook(addressBookStorage.getAddressBookFilePath());
+ public Optional readMedLogger() throws DataLoadingException {
+ return readMedLogger(medLoggerStorage.getMedLoggerFilePath());
}
@Override
- public Optional readAddressBook(Path filePath) throws DataLoadingException {
+ public Optional readMedLogger(Path filePath) throws DataLoadingException {
logger.fine("Attempting to read data from file: " + filePath);
- return addressBookStorage.readAddressBook(filePath);
+ return medLoggerStorage.readMedLogger(filePath);
}
@Override
- public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {
- saveAddressBook(addressBook, addressBookStorage.getAddressBookFilePath());
+ public void saveMedLogger(ReadOnlyMedLogger medLogger) throws IOException {
+ saveMedLogger(medLogger, medLoggerStorage.getMedLoggerFilePath());
}
@Override
- public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {
+ public void saveMedLogger(ReadOnlyMedLogger medLogger, Path filePath) throws IOException {
logger.fine("Attempting to write to data file: " + filePath);
- addressBookStorage.saveAddressBook(addressBook, filePath);
+ medLoggerStorage.saveMedLogger(medLogger, filePath);
}
}
diff --git a/src/main/java/seedu/address/ui/HelpWindow.java b/src/main/java/seedu/address/ui/HelpWindow.java
index 3f16b2fcf26..69c931a4f9d 100644
--- a/src/main/java/seedu/address/ui/HelpWindow.java
+++ b/src/main/java/seedu/address/ui/HelpWindow.java
@@ -15,7 +15,7 @@
*/
public class HelpWindow extends UiPart {
- public static final String USERGUIDE_URL = "https://se-education.org/addressbook-level3/UserGuide.html";
+ public static final String USERGUIDE_URL = "https://ay2425s2-cs2103t-w09-3.github.io/tp/UserGuide.html";
public static final String HELP_MESSAGE = "Refer to the user guide: " + USERGUIDE_URL;
private static final Logger logger = LogsCenter.getLogger(HelpWindow.class);
diff --git a/src/main/java/seedu/address/ui/MainWindow.java b/src/main/java/seedu/address/ui/MainWindow.java
index 79e74ef37c0..709b2ab0d2c 100644
--- a/src/main/java/seedu/address/ui/MainWindow.java
+++ b/src/main/java/seedu/address/ui/MainWindow.java
@@ -2,8 +2,10 @@
import java.util.logging.Logger;
+import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
+import javafx.scene.Scene;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextInputControl;
import javafx.scene.input.KeyCombination;
@@ -32,8 +34,10 @@ public class MainWindow extends UiPart {
// Independent Ui parts residing in this Ui container
private PersonListPanel personListPanel;
+ private VisitListPanel visitListPanel;
private ResultDisplay resultDisplay;
private HelpWindow helpWindow;
+ private boolean isDarkMode = false;
@FXML
private StackPane commandBoxPlaceholder;
@@ -44,11 +48,14 @@ public class MainWindow extends UiPart {
@FXML
private StackPane personListPanelPlaceholder;
+ @FXML
+ private StackPane visitListPanelPlaceholder;
+
@FXML
private StackPane resultDisplayPlaceholder;
@FXML
- private StackPane statusbarPlaceholder;
+ private StackPane statusbarPlaceholder;;
/**
* Creates a {@code MainWindow} with the given {@code Stage} and {@code Logic}.
@@ -111,16 +118,24 @@ private void setAccelerator(MenuItem menuItem, KeyCombination keyCombination) {
*/
void fillInnerParts() {
personListPanel = new PersonListPanel(logic.getFilteredPersonList());
+ personListPanel.setPersonSelectionCallback(selectedPerson -> {
+ logic.updateFilteredVisitList(visit ->
+ visit.getNric().equals(selectedPerson.getNric()));
+ });
personListPanelPlaceholder.getChildren().add(personListPanel.getRoot());
+ visitListPanel = new VisitListPanel(logic.getSortedVisitList());
+ visitListPanelPlaceholder.getChildren().add(visitListPanel.getRoot());
+
resultDisplay = new ResultDisplay();
resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot());
- StatusBarFooter statusBarFooter = new StatusBarFooter(logic.getAddressBookFilePath());
+ StatusBarFooter statusBarFooter = new StatusBarFooter(logic.getMedLoggerFilePath());
statusbarPlaceholder.getChildren().add(statusBarFooter.getRoot());
CommandBox commandBox = new CommandBox(this::executeCommand);
commandBoxPlaceholder.getChildren().add(commandBox.getRoot());
+
}
/**
@@ -193,4 +208,20 @@ private CommandResult executeCommand(String commandText) throws CommandException
throw e;
}
}
+
+ @FXML
+ private void handleToggleTheme() {
+ Scene scene = getPrimaryStage().getScene();
+ ObservableList stylesheets = scene.getStylesheets();
+ stylesheets.clear();
+
+ if (isDarkMode) {
+ // Remove stylesheet (back to default)
+ } else {
+ stylesheets.add(getClass().getResource("/view/DarkTheme.css").toExternalForm());
+ }
+
+ isDarkMode = !isDarkMode;
+ resultDisplay.handleToggleTheme(isDarkMode);
+ }
}
diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java
index 094c42cda82..7f8b97e91b6 100644
--- a/src/main/java/seedu/address/ui/PersonCard.java
+++ b/src/main/java/seedu/address/ui/PersonCard.java
@@ -21,7 +21,7 @@ public class PersonCard extends UiPart {
* As a consequence, UI elements' variable names cannot be set to such keywords
* or an exception will be thrown by JavaFX during runtime.
*
- * @see The issue on AddressBook level 4
+ * @see The issue on MedLogger level 4
*/
public final Person person;
@@ -31,6 +31,8 @@ public class PersonCard extends UiPart {
@FXML
private Label name;
@FXML
+ private Label nric;
+ @FXML
private Label id;
@FXML
private Label phone;
@@ -40,6 +42,8 @@ public class PersonCard extends UiPart {
private Label email;
@FXML
private FlowPane tags;
+ @FXML
+ private Label remark;
/**
* Creates a {@code PersonCode} with the given {@code Person} and index to display.
@@ -49,9 +53,13 @@ public PersonCard(Person person, int displayedIndex) {
this.person = person;
id.setText(displayedIndex + ". ");
name.setText(person.getName().fullName);
- phone.setText(person.getPhone().value);
- address.setText(person.getAddress().value);
- email.setText(person.getEmail().value);
+ nric.setText("NRIC: " + person.getNric().value);
+ phone.setText("Phone number: " + person.getPhone().value);
+ email.setText("Email: " + person.getEmail().value);
+ address.setText("Address: " + person.getAddress().value);
+ // Add symptoms and treatments here
+ String remarkStr = person.getRemark().value;
+ remark.setText(remarkStr.isEmpty() ? "" : "Remark: " + remarkStr);
person.getTags().stream()
.sorted(Comparator.comparing(tag -> tag.tagName))
.forEach(tag -> tags.getChildren().add(new Label(tag.tagName)));
diff --git a/src/main/java/seedu/address/ui/PersonListPanel.java b/src/main/java/seedu/address/ui/PersonListPanel.java
index f4c501a897b..999815a1de1 100644
--- a/src/main/java/seedu/address/ui/PersonListPanel.java
+++ b/src/main/java/seedu/address/ui/PersonListPanel.java
@@ -1,5 +1,6 @@
package seedu.address.ui;
+import java.util.function.Consumer;
import java.util.logging.Logger;
import javafx.collections.ObservableList;
@@ -20,6 +21,8 @@ public class PersonListPanel extends UiPart {
@FXML
private ListView personListView;
+ private Consumer personSelectionCallback;
+
/**
* Creates a {@code PersonListPanel} with the given {@code ObservableList}.
*/
@@ -27,6 +30,14 @@ public PersonListPanel(ObservableList personList) {
super(FXML);
personListView.setItems(personList);
personListView.setCellFactory(listView -> new PersonListViewCell());
+
+ personListView.getSelectionModel().selectedItemProperty().addListener((
+ observable, oldValue, newValue) -> {
+ if (newValue != null && personSelectionCallback != null) {
+ personSelectionCallback.accept(newValue);
+ }
+ }
+ );
}
/**
@@ -46,4 +57,8 @@ protected void updateItem(Person person, boolean empty) {
}
}
+ public void setPersonSelectionCallback(Consumer callback) {
+ this.personSelectionCallback = callback;
+ }
+
}
diff --git a/src/main/java/seedu/address/ui/ResultDisplay.java b/src/main/java/seedu/address/ui/ResultDisplay.java
index 7d98e84eedf..3132003a922 100644
--- a/src/main/java/seedu/address/ui/ResultDisplay.java
+++ b/src/main/java/seedu/address/ui/ResultDisplay.java
@@ -12,6 +12,7 @@
public class ResultDisplay extends UiPart {
private static final String FXML = "ResultDisplay.fxml";
+ private boolean isDarkMode = true;
@FXML
private TextArea resultDisplay;
@@ -23,6 +24,29 @@ public ResultDisplay() {
public void setFeedbackToUser(String feedbackToUser) {
requireNonNull(feedbackToUser);
resultDisplay.setText(feedbackToUser);
+ resultDisplay.getStyleClass().removeAll("result-success", "result-error-light", "result-error-dark");
+ boolean isError = feedbackToUser.startsWith("Invalid")
+ || feedbackToUser.startsWith("Error")
+ || feedbackToUser.startsWith("Unknown");
+ if (isError) {
+ resultDisplay.getStyleClass().add(isDarkMode ? "result-error-dark" : "result-error-light");
+ } else {
+ resultDisplay.getStyleClass().add("result-success");
+ }
}
+ /**
+ * Sets the result display to the colour mode.
+ *
+ * @param isDarkMode true if the application is in dark mode, false otherwise.
+ */
+ public void handleToggleTheme(boolean isDarkMode) {
+ this.isDarkMode = isDarkMode;
+ setFeedbackToUser(resultDisplay.getText());
+ // if (isDarkMode) {
+ // resultDisplay.setStyle("-fx-background-color: #2b2b2b; -fx-text-fill: white;");
+ // } else {
+ // resultDisplay.setStyle("-fx-background-color: white; -fx-text-fill: black;");
+ // }
+ }
}
diff --git a/src/main/java/seedu/address/ui/UiManager.java b/src/main/java/seedu/address/ui/UiManager.java
index fdf024138bc..0e48b7e906e 100644
--- a/src/main/java/seedu/address/ui/UiManager.java
+++ b/src/main/java/seedu/address/ui/UiManager.java
@@ -20,7 +20,7 @@ public class UiManager implements Ui {
public static final String ALERT_DIALOG_PANE_FIELD_ID = "alertDialogPane";
private static final Logger logger = LogsCenter.getLogger(UiManager.class);
- private static final String ICON_APPLICATION = "/images/address_book_32.png";
+ private static final String ICON_APPLICATION = "/images/med_logger_32.png";
private Logic logic;
private MainWindow mainWindow;
diff --git a/src/main/java/seedu/address/ui/VisitCard.java b/src/main/java/seedu/address/ui/VisitCard.java
new file mode 100644
index 00000000000..5f9eab4acc3
--- /dev/null
+++ b/src/main/java/seedu/address/ui/VisitCard.java
@@ -0,0 +1,57 @@
+package seedu.address.ui;
+
+import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Region;
+import seedu.address.model.person.Visit;
+
+/**
+ * An UI component that displays information of a {@code Visit}.
+ */
+public class VisitCard extends UiPart {
+
+ private static final String FXML = "VisitListCard.fxml";
+
+ public final Visit visit;
+
+ @FXML
+ private HBox cardPane;
+ @FXML
+ private Label id;
+ @FXML
+ private Label name;
+ @FXML
+ private Label nric;
+ @FXML
+ private Label time;
+ @FXML
+ private Label remark;
+ @FXML
+ private Label symptom;
+ @FXML
+ private Label diagnosis;
+ @FXML
+ private Label medication;
+ @FXML
+ private Label followUp;
+
+ /**
+ * Creates a {@code VisitCard} with the given {@code Visit} and index to display.
+ */
+ public VisitCard(Visit visit, int displayedIndex) {
+ super(FXML);
+ this.visit = visit;
+
+ id.setText(displayedIndex + ". ");
+ name.setText(visit.getPerson().getName().fullName);
+ nric.setText("NRIC: " + visit.getPerson().getNric().value);
+ time.setText("Visit Time: " + visit.getDateTime().toString());
+
+ remark.setText(visit.getRemark().value.isEmpty() ? "" : "Remark: " + visit.getRemark().value);
+ symptom.setText("Symptom: " + visit.getSymptom().value);
+ diagnosis.setText("Diagnosis: " + visit.getDiagnosis().value);
+ medication.setText("Medication: " + visit.getMedication().value);
+ followUp.setText("Follow-up: " + visit.getFollowUp().value);
+ }
+}
diff --git a/src/main/java/seedu/address/ui/VisitListPanel.java b/src/main/java/seedu/address/ui/VisitListPanel.java
new file mode 100644
index 00000000000..8b668729639
--- /dev/null
+++ b/src/main/java/seedu/address/ui/VisitListPanel.java
@@ -0,0 +1,48 @@
+package seedu.address.ui;
+
+import java.util.logging.Logger;
+
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.scene.control.ListCell;
+import javafx.scene.control.ListView;
+import javafx.scene.layout.Region;
+import seedu.address.commons.core.LogsCenter;
+import seedu.address.model.person.Visit;
+
+/**
+ * Panel containing the list of visits.
+ */
+public class VisitListPanel extends UiPart {
+ private static final String FXML = "VisitListPanel.fxml";
+ private final Logger logger = LogsCenter.getLogger(VisitListPanel.class);
+
+ @FXML
+ private ListView visitListView;
+
+ /**
+ * Creates a {@code VisitListPanel} with the given {@code ObservableList}.
+ */
+ public VisitListPanel(ObservableList visitList) {
+ super(FXML);
+ visitListView.setItems(visitList);
+ visitListView.setCellFactory(listView -> new VisitListViewCell());
+ }
+
+ /**
+ * Custom {@code ListCell} that displays the graphics of a {@code Visit} using a {@code VisitCard}.
+ */
+ class VisitListViewCell extends ListCell {
+ @Override
+ protected void updateItem(Visit visit, boolean empty) {
+ super.updateItem(visit, empty);
+
+ if (empty || visit == null) {
+ setGraphic(null);
+ setText(null);
+ } else {
+ setGraphic(new VisitCard(visit, getIndex() + 1).getRoot());
+ }
+ }
+ }
+}
diff --git a/src/main/resources/images/address_book_32.png b/src/main/resources/images/med_logger_32.png
similarity index 100%
rename from src/main/resources/images/address_book_32.png
rename to src/main/resources/images/med_logger_32.png
diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css
index 36e6b001cd8..e3d0fd69182 100644
--- a/src/main/resources/view/DarkTheme.css
+++ b/src/main/resources/view/DarkTheme.css
@@ -350,3 +350,21 @@
-fx-background-radius: 2;
-fx-font-size: 11;
}
+
+.section-header {
+ -fx-text-fill: white;
+ -fx-font-size: 14px;
+ -fx-font-weight: bold;
+}
+
+.result-success {
+ -fx-text-fill: green;
+}
+
+.result-error-dark {
+ -fx-text-fill: white;
+}
+
+.result-error-light {
+ -fx-text-fill: black;
+}
diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml
index 7778f666a0a..399fa19228d 100644
--- a/src/main/resources/view/MainWindow.fxml
+++ b/src/main/resources/view/MainWindow.fxml
@@ -10,11 +10,15 @@
+
+
+
+
+ title="Med Logger" minWidth="650" minHeight="600" onCloseRequest="#handleExit">
-
+
@@ -31,8 +35,17 @@
+
+
+
+
+
@@ -40,18 +53,36 @@
+ minHeight="150" prefHeight="100" maxHeight="300">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/view/PersonListCard.fxml b/src/main/resources/view/PersonListCard.fxml
index 84e09833a87..29ee196bc62 100644
--- a/src/main/resources/view/PersonListCard.fxml
+++ b/src/main/resources/view/PersonListCard.fxml
@@ -28,9 +28,11 @@
+
-
+
+
diff --git a/src/main/resources/view/VisitListCard.fxml b/src/main/resources/view/VisitListCard.fxml
new file mode 100644
index 00000000000..fcdcb0ede04
--- /dev/null
+++ b/src/main/resources/view/VisitListCard.fxml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/view/VisitListPanel.fxml b/src/main/resources/view/VisitListPanel.fxml
new file mode 100644
index 00000000000..038e7cc8d24
--- /dev/null
+++ b/src/main/resources/view/VisitListPanel.fxml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json b/src/test/data/JsonMedLoggerStorageTest/invalidAndValidPersonMedLogger.json
similarity index 65%
rename from src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
rename to src/test/data/JsonMedLoggerStorageTest/invalidAndValidPersonMedLogger.json
index 6a4d2b7181c..ab8141f4dd1 100644
--- a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
+++ b/src/test/data/JsonMedLoggerStorageTest/invalidAndValidPersonMedLogger.json
@@ -3,11 +3,13 @@
"name": "Valid Person",
"phone": "9482424",
"email": "hans@example.com",
- "address": "4th street"
+ "address": "4th street",
+ "date": "2023-12-31 11:11"
}, {
"name": "Person With Invalid Phone Field",
"phone": "948asdf2424",
"email": "hans@example.com",
- "address": "4th street"
+ "address": "4th street",
+ "date": "2023-12-31 11:11"
} ]
}
diff --git a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json b/src/test/data/JsonMedLoggerStorageTest/invalidPersonMedLogger.json
similarity index 70%
rename from src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
rename to src/test/data/JsonMedLoggerStorageTest/invalidPersonMedLogger.json
index ccd21f7d1a9..729cacc95ae 100644
--- a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
+++ b/src/test/data/JsonMedLoggerStorageTest/invalidPersonMedLogger.json
@@ -3,6 +3,7 @@
"name": "Person with invalid name field: Ha!ns Mu@ster",
"phone": "9482424",
"email": "hans@example.com",
- "address": "4th street"
+ "address": "4th street",
+ "date": "2023-12-31 11:11"
} ]
}
diff --git a/src/test/data/JsonAddressBookStorageTest/notJsonFormatAddressBook.json b/src/test/data/JsonMedLoggerStorageTest/notJsonFormatMedLogger.json
similarity index 100%
rename from src/test/data/JsonAddressBookStorageTest/notJsonFormatAddressBook.json
rename to src/test/data/JsonMedLoggerStorageTest/notJsonFormatMedLogger.json
diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json b/src/test/data/JsonSerializableMedLoggerTest/duplicatePersonMedLogger.json
similarity index 66%
rename from src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
rename to src/test/data/JsonSerializableMedLoggerTest/duplicatePersonMedLogger.json
index a7427fe7aa2..9f85bb31bab 100644
--- a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
+++ b/src/test/data/JsonSerializableMedLoggerTest/duplicatePersonMedLogger.json
@@ -1,14 +1,19 @@
{
"persons": [ {
"name": "Alice Pauline",
+ "NRIC": "S1234567A",
"phone": "94351253",
"email": "alice@example.com",
"address": "123, Jurong West Ave 6, #08-111",
+ "remark" : "",
"tags": [ "friends" ]
}, {
"name": "Alice Pauline",
+ "NRIC": "S1234567A",
"phone": "94351253",
"email": "pauline@example.com",
- "address": "4th street"
- } ]
+ "address": "4th street",
+ "remark" : ""
+ } ],
+ "visits" : [ ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json b/src/test/data/JsonSerializableMedLoggerTest/invalidPersonMedLogger.json
similarity index 70%
rename from src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
rename to src/test/data/JsonSerializableMedLoggerTest/invalidPersonMedLogger.json
index ad3f135ae42..5bbd96e7b57 100644
--- a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
+++ b/src/test/data/JsonSerializableMedLoggerTest/invalidPersonMedLogger.json
@@ -3,6 +3,8 @@
"name": "Hans Muster",
"phone": "9482424",
"email": "invalid@email!3e",
+ "date": "2023-12-31 11:11",
"address": "4th street"
- } ]
+ } ],
+ "visits" : [ ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json b/src/test/data/JsonSerializableMedLoggerTest/typicalPersonsMedLogger.json
similarity index 62%
rename from src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
rename to src/test/data/JsonSerializableMedLoggerTest/typicalPersonsMedLogger.json
index 72262099d35..bf3023004dc 100644
--- a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
+++ b/src/test/data/JsonSerializableMedLoggerTest/typicalPersonsMedLogger.json
@@ -1,46 +1,61 @@
{
- "_comment": "AddressBook save file which contains the same Person values as in TypicalPersons#getTypicalAddressBook()",
+ "_comment": "MedLogger save file which contains the same Person values as in TypicalPersons#getTypicalMedLogger()",
"persons" : [ {
"name" : "Alice Pauline",
- "phone" : "94351253",
+ "NRIC" : "S1234567A",
+ "phone" : "88888888",
"email" : "alice@example.com",
"address" : "123, Jurong West Ave 6, #08-111",
+ "remark" : "",
"tags" : [ "friends" ]
}, {
"name" : "Benson Meier",
- "phone" : "98765432",
+ "NRIC" : "S1234567B",
+ "phone" : "99999999",
"email" : "johnd@example.com",
"address" : "311, Clementi Ave 2, #02-25",
+ "remark" : "",
"tags" : [ "owesMoney", "friends" ]
}, {
"name" : "Carl Kurz",
+ "NRIC" : "S1234567C",
"phone" : "95352563",
"email" : "heinz@example.com",
"address" : "wall street",
+ "remark" : "",
"tags" : [ ]
}, {
"name" : "Daniel Meier",
+ "NRIC" : "S1234567D",
"phone" : "87652533",
"email" : "cornelia@example.com",
"address" : "10th street",
+ "remark" : "",
"tags" : [ "friends" ]
}, {
"name" : "Elle Meyer",
- "phone" : "9482224",
+ "NRIC" : "S1234567E",
+ "phone" : "94822224",
"email" : "werner@example.com",
"address" : "michegan ave",
+ "remark" : "",
"tags" : [ ]
}, {
"name" : "Fiona Kunz",
- "phone" : "9482427",
+ "NRIC" : "S1234567F",
+ "phone" : "94822427",
"email" : "lydia@example.com",
"address" : "little tokyo",
+ "remark" : "",
"tags" : [ ]
}, {
"name" : "George Best",
- "phone" : "9482442",
+ "NRIC" : "S1234567G",
+ "phone" : "94822442",
"email" : "anna@example.com",
"address" : "4th street",
+ "remark" : "",
"tags" : [ ]
- } ]
+ } ],
+ "visits" : [ ]
}
diff --git a/src/test/data/JsonUserPrefsStorageTest/ExtraValuesUserPref.json b/src/test/data/JsonUserPrefsStorageTest/ExtraValuesUserPref.json
index 1037548a9cd..ca5152f66c3 100644
--- a/src/test/data/JsonUserPrefsStorageTest/ExtraValuesUserPref.json
+++ b/src/test/data/JsonUserPrefsStorageTest/ExtraValuesUserPref.json
@@ -9,5 +9,5 @@
"z" : 99
}
},
- "addressBookFilePath" : "addressbook.json"
+ "medLoggerFilePath" : "medlogger.json"
}
diff --git a/src/test/data/JsonUserPrefsStorageTest/TypicalUserPref.json b/src/test/data/JsonUserPrefsStorageTest/TypicalUserPref.json
index b819bed900a..575a4c5cecd 100644
--- a/src/test/data/JsonUserPrefsStorageTest/TypicalUserPref.json
+++ b/src/test/data/JsonUserPrefsStorageTest/TypicalUserPref.json
@@ -1,11 +1,11 @@
{
- "guiSettings" : {
- "windowWidth" : 1000.0,
- "windowHeight" : 500.0,
- "windowCoordinates" : {
- "x" : 300,
- "y" : 100
+ "guiSettings": {
+ "windowWidth": 1000.0,
+ "windowHeight": 500.0,
+ "windowCoordinates": {
+ "x": 300,
+ "y": 100
}
},
- "addressBookFilePath" : "addressbook.json"
+ "medLoggerFilePath": "medlogger.json"
}
diff --git a/src/test/java/seedu/address/commons/util/AppUtilTest.java b/src/test/java/seedu/address/commons/util/AppUtilTest.java
index 594de1e6365..d096ab42294 100644
--- a/src/test/java/seedu/address/commons/util/AppUtilTest.java
+++ b/src/test/java/seedu/address/commons/util/AppUtilTest.java
@@ -9,7 +9,7 @@ public class AppUtilTest {
@Test
public void getImage_exitingImage() {
- assertNotNull(AppUtil.getImage("/images/address_book_32.png"));
+ assertNotNull(AppUtil.getImage("/images/med_logger_32.png"));
}
@Test
diff --git a/src/test/java/seedu/address/commons/util/FileUtilTest.java b/src/test/java/seedu/address/commons/util/FileUtilTest.java
index 1fe5478c756..6e72d994163 100644
--- a/src/test/java/seedu/address/commons/util/FileUtilTest.java
+++ b/src/test/java/seedu/address/commons/util/FileUtilTest.java
@@ -1,9 +1,13 @@
package seedu.address.commons.util;
+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 java.util.List;
+import java.util.Map;
+
import org.junit.jupiter.api.Test;
public class FileUtilTest {
@@ -20,4 +24,57 @@ public void isValidPath() {
assertThrows(NullPointerException.class, () -> FileUtil.isValidPath(null));
}
+ @Test
+ public void extractJsonObjects_validJson_returnsParsedList() throws Exception {
+ String json = """
+ {
+ "persons": [
+ {"name": "Alice", "phone": "98765432"},
+ {"name": "Bob", "phone": "87654321"}
+ ]
+ }
+ """;
+
+ List> result = FileUtil.extractJsonObjects(json, "persons");
+ assertEquals(2, result.size());
+ assertEquals("Alice", result.get(0).get("name"));
+ assertEquals("87654321", result.get(1).get("phone"));
+ }
+
+ @Test
+ public void extractJsonObjects_arrayKeyNotFound_returnsEmptyList() throws Exception {
+ String json = """
+ {
+ "contacts": []
+ }
+ """;
+
+ List> result = FileUtil.extractJsonObjects(json, "persons");
+ assertTrue(result.isEmpty());
+ }
+
+ @Test
+ public void extractJsonObjects_handlesArrayValuesAsString() throws Exception {
+ String json = """
+ {
+ "persons": [
+ {"name": "Charlie", "tags": ["friend", "colleague"]}
+ ]
+ }
+ """;
+
+ List> result = FileUtil.extractJsonObjects(json, "persons");
+ assertEquals("[\"friend\",\"colleague\"]", result.get(0).get("tags"));
+ }
+
+ @Test
+ public void quote_noSpecialChars_returnsSameString() {
+ assertEquals("hello", FileUtil.quote("hello"));
+ }
+
+ @Test
+ public void quote_containsQuote_escapesQuoteCorrectly() {
+ assertEquals("\"He said \"\"hello\"\"\"", FileUtil.quote("He said \"hello\""));
+ }
+
}
diff --git a/src/test/java/seedu/address/logic/LogicManagerTest.java b/src/test/java/seedu/address/logic/LogicManagerTest.java
index baf8ce336a2..db7e4d88f97 100644
--- a/src/test/java/seedu/address/logic/LogicManagerTest.java
+++ b/src/test/java/seedu/address/logic/LogicManagerTest.java
@@ -6,6 +6,7 @@
import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;
+import static seedu.address.logic.commands.CommandTestUtil.NRIC_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;
import static seedu.address.testutil.Assert.assertThrows;
import static seedu.address.testutil.TypicalPersons.AMY;
@@ -18,17 +19,17 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
-import seedu.address.logic.commands.AddCommand;
+import seedu.address.logic.commands.AddPersonCommand;
import seedu.address.logic.commands.CommandResult;
import seedu.address.logic.commands.ListCommand;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.Model;
import seedu.address.model.ModelManager;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.UserPrefs;
import seedu.address.model.person.Person;
-import seedu.address.storage.JsonAddressBookStorage;
+import seedu.address.storage.JsonMedLoggerStorage;
import seedu.address.storage.JsonUserPrefsStorage;
import seedu.address.storage.StorageManager;
import seedu.address.testutil.PersonBuilder;
@@ -45,10 +46,10 @@ public class LogicManagerTest {
@BeforeEach
public void setUp() {
- JsonAddressBookStorage addressBookStorage =
- new JsonAddressBookStorage(temporaryFolder.resolve("addressBook.json"));
+ JsonMedLoggerStorage medLoggerStorage =
+ new JsonMedLoggerStorage(temporaryFolder.resolve("medLogger.json"));
JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(temporaryFolder.resolve("userPrefs.json"));
- StorageManager storage = new StorageManager(addressBookStorage, userPrefsStorage);
+ StorageManager storage = new StorageManager(medLoggerStorage, userPrefsStorage);
logic = new LogicManager(model, storage);
}
@@ -123,7 +124,7 @@ private void assertCommandException(String inputCommand, String expectedMessage)
*/
private void assertCommandFailure(String inputCommand, Class extends Throwable> expectedException,
String expectedMessage) {
- Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs());
+ Model expectedModel = new ModelManager(model.getMedLogger(), new UserPrefs());
assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);
}
@@ -149,10 +150,10 @@ private void assertCommandFailure(String inputCommand, Class extends Throwable
private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {
Path prefPath = temporaryFolder.resolve("ExceptionUserPrefs.json");
- // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving
- JsonAddressBookStorage addressBookStorage = new JsonAddressBookStorage(prefPath) {
+ // Inject LogicManager with an MedLoggerStorage that throws the IOException e when saving
+ JsonMedLoggerStorage medLoggerStorage = new JsonMedLoggerStorage(prefPath) {
@Override
- public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)
+ public void saveMedLogger(ReadOnlyMedLogger medLogger, Path filePath)
throws IOException {
throw e;
}
@@ -160,12 +161,12 @@ 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(medLoggerStorage, userPrefsStorage);
logic = new LogicManager(model, storage);
- // Triggers the saveAddressBook method by executing an add command
- String addCommand = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY
+ // Triggers the saveMedLogger method by executing an add command
+ String addCommand = AddPersonCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY
+ EMAIL_DESC_AMY + ADDRESS_DESC_AMY;
Person expectedPerson = new PersonBuilder(AMY).withTags().build();
ModelManager expectedModel = new ModelManager();
diff --git a/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java b/src/test/java/seedu/address/logic/commands/AddPersonCommandIntegrationTest.java
similarity index 58%
rename from src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java
rename to src/test/java/seedu/address/logic/commands/AddPersonCommandIntegrationTest.java
index 162a0c86031..e73ad2b28a3 100644
--- a/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java
+++ b/src/test/java/seedu/address/logic/commands/AddPersonCommandIntegrationTest.java
@@ -2,7 +2,7 @@
import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -15,34 +15,34 @@
import seedu.address.testutil.PersonBuilder;
/**
- * Contains integration tests (interaction with the Model) for {@code AddCommand}.
+ * Contains integration tests (interaction with the Model) for {@code AddPersonCommand}.
*/
-public class AddCommandIntegrationTest {
+public class AddPersonCommandIntegrationTest {
private Model model;
@BeforeEach
public void setUp() {
- model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
+ model = new ModelManager(getTypicalMedLogger(), 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.getMedLogger(), new UserPrefs());
expectedModel.addPerson(validPerson);
- assertCommandSuccess(new AddCommand(validPerson), model,
- String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),
+ assertCommandSuccess(new AddPersonCommand(validPerson), model,
+ String.format(AddPersonCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),
expectedModel);
}
@Test
public void execute_duplicatePerson_throwsCommandException() {
- Person personInList = model.getAddressBook().getPersonList().get(0);
- assertCommandFailure(new AddCommand(personInList), model,
- AddCommand.MESSAGE_DUPLICATE_PERSON);
+ Person personInList = model.getMedLogger().getPersonList().get(0);
+ assertCommandFailure(new AddPersonCommand(personInList), model,
+ AddPersonCommand.MESSAGE_DUPLICATE_PERSON);
}
}
diff --git a/src/test/java/seedu/address/logic/commands/AddCommandTest.java b/src/test/java/seedu/address/logic/commands/AddPersonCommandTest.java
similarity index 60%
rename from src/test/java/seedu/address/logic/commands/AddCommandTest.java
rename to src/test/java/seedu/address/logic/commands/AddPersonCommandTest.java
index 90e8253f48e..9e7b95e25e6 100644
--- a/src/test/java/seedu/address/logic/commands/AddCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/AddPersonCommandTest.java
@@ -10,6 +10,8 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Optional;
import java.util.function.Predicate;
import org.junit.jupiter.api.Test;
@@ -18,18 +20,21 @@
import seedu.address.commons.core.GuiSettings;
import seedu.address.logic.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
-import seedu.address.model.AddressBook;
+import seedu.address.model.MedLogger;
import seedu.address.model.Model;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.ReadOnlyUserPrefs;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
+import seedu.address.model.person.Visit;
import seedu.address.testutil.PersonBuilder;
-public class AddCommandTest {
+
+public class AddPersonCommandTest {
@Test
public void constructor_nullPerson_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> new AddCommand(null));
+ assertThrows(NullPointerException.class, () -> new AddPersonCommand(null));
}
@Test
@@ -37,9 +42,9 @@ public void execute_personAcceptedByModel_addSuccessful() throws Exception {
ModelStubAcceptingPersonAdded modelStub = new ModelStubAcceptingPersonAdded();
Person validPerson = new PersonBuilder().build();
- CommandResult commandResult = new AddCommand(validPerson).execute(modelStub);
+ CommandResult commandResult = new AddPersonCommand(validPerson).execute(modelStub);
- assertEquals(String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),
+ assertEquals(String.format(AddPersonCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),
commandResult.getFeedbackToUser());
assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);
}
@@ -47,24 +52,25 @@ public void execute_personAcceptedByModel_addSuccessful() throws Exception {
@Test
public void execute_duplicatePerson_throwsCommandException() {
Person validPerson = new PersonBuilder().build();
- AddCommand addCommand = new AddCommand(validPerson);
+ AddPersonCommand addPersonCommand = new AddPersonCommand(validPerson);
ModelStub modelStub = new ModelStubWithPerson(validPerson);
- assertThrows(CommandException.class, AddCommand.MESSAGE_DUPLICATE_PERSON, () -> addCommand.execute(modelStub));
+ assertThrows(CommandException.class, AddPersonCommand.MESSAGE_DUPLICATE_PERSON, ()
+ -> addPersonCommand.execute(modelStub));
}
@Test
public void equals() {
Person alice = new PersonBuilder().withName("Alice").build();
Person bob = new PersonBuilder().withName("Bob").build();
- AddCommand addAliceCommand = new AddCommand(alice);
- AddCommand addBobCommand = new AddCommand(bob);
+ AddPersonCommand addAliceCommand = new AddPersonCommand(alice);
+ AddPersonCommand addBobCommand = new AddPersonCommand(bob);
// same object -> returns true
assertTrue(addAliceCommand.equals(addAliceCommand));
// same values -> returns true
- AddCommand addAliceCommandCopy = new AddCommand(alice);
+ AddPersonCommand addAliceCommandCopy = new AddPersonCommand(alice);
assertTrue(addAliceCommand.equals(addAliceCommandCopy));
// different types -> returns false
@@ -79,9 +85,9 @@ public void equals() {
@Test
public void toStringMethod() {
- AddCommand addCommand = new AddCommand(ALICE);
- String expected = AddCommand.class.getCanonicalName() + "{toAdd=" + ALICE + "}";
- assertEquals(expected, addCommand.toString());
+ AddPersonCommand addPersonCommand = new AddPersonCommand(ALICE);
+ String expected = AddPersonCommand.class.getCanonicalName() + "{toAdd=" + ALICE + "}";
+ assertEquals(expected, addPersonCommand.toString());
}
/**
@@ -109,12 +115,12 @@ public void setGuiSettings(GuiSettings guiSettings) {
}
@Override
- public Path getAddressBookFilePath() {
+ public Path getMedLoggerFilePath() {
throw new AssertionError("This method should not be called.");
}
@Override
- public void setAddressBookFilePath(Path addressBookFilePath) {
+ public void setMedLoggerFilePath(Path medLoggerFilePath) {
throw new AssertionError("This method should not be called.");
}
@@ -124,12 +130,26 @@ public void addPerson(Person person) {
}
@Override
- public void setAddressBook(ReadOnlyAddressBook newData) {
+ public void addVisit(Visit visit) {
throw new AssertionError("This method should not be called.");
}
@Override
- public ReadOnlyAddressBook getAddressBook() {
+ public void deleteVisit(Visit visit) {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public void clearVisits() {
+ throw new AssertionError("This method should not be called.");
+ }
+ @Override
+ public void setMedLogger(ReadOnlyMedLogger newData) {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public ReadOnlyMedLogger getMedLogger() {
throw new AssertionError("This method should not be called.");
}
@@ -138,6 +158,16 @@ public boolean hasPerson(Person person) {
throw new AssertionError("This method should not be called.");
}
+ @Override
+ public Optional getPersonByNric(Nric nric) {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public boolean hasVisit(Visit visit) {
+ throw new AssertionError("This method should not be called.");
+ }
+
@Override
public void deletePerson(Person target) {
throw new AssertionError("This method should not be called.");
@@ -148,6 +178,11 @@ public void setPerson(Person target, Person editedPerson) {
throw new AssertionError("This method should not be called.");
}
+ @Override
+ public void setVisit(Visit target, Visit editedPerson) {
+ throw new AssertionError("This method should not be called.");
+ }
+
@Override
public ObservableList getFilteredPersonList() {
throw new AssertionError("This method should not be called.");
@@ -157,6 +192,41 @@ public ObservableList getFilteredPersonList() {
public void updateFilteredPersonList(Predicate predicate) {
throw new AssertionError("This method should not be called.");
}
+
+ @Override
+ public void updateSubFilteredPersonList(int n) {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public ObservableList getFilteredVisitList() {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public void updateFilteredVisitList(Predicate predicate) {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public void updateSubFilteredVisitList(int n) {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public int size() {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public void sortFilteredVisitList(Comparator comparator) {
+ throw new AssertionError("This method should not be called.");
+ }
+
+ @Override
+ public ObservableList getSortedVisitList() {
+ throw new AssertionError("This method should not be called.");
+ }
}
/**
@@ -196,8 +266,8 @@ public void addPerson(Person person) {
}
@Override
- public ReadOnlyAddressBook getAddressBook() {
- return new AddressBook();
+ public ReadOnlyMedLogger getMedLogger() {
+ return new MedLogger();
}
}
diff --git a/src/test/java/seedu/address/logic/commands/ClearCommandTest.java b/src/test/java/seedu/address/logic/commands/ClearCommandTest.java
index 80d9110c03a..616bfd24769 100644
--- a/src/test/java/seedu/address/logic/commands/ClearCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/ClearCommandTest.java
@@ -1,11 +1,11 @@
package seedu.address.logic.commands;
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
import org.junit.jupiter.api.Test;
-import seedu.address.model.AddressBook;
+import seedu.address.model.MedLogger;
import seedu.address.model.Model;
import seedu.address.model.ModelManager;
import seedu.address.model.UserPrefs;
@@ -13,7 +13,7 @@
public class ClearCommandTest {
@Test
- public void execute_emptyAddressBook_success() {
+ public void execute_emptyMedLogger_success() {
Model model = new ModelManager();
Model expectedModel = new ModelManager();
@@ -21,10 +21,10 @@ 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());
- expectedModel.setAddressBook(new AddressBook());
+ public void execute_nonEmptyMedLogger_success() {
+ Model model = new ModelManager(getTypicalMedLogger(), new UserPrefs());
+ Model expectedModel = new ModelManager(getTypicalMedLogger(), new UserPrefs());
+ expectedModel.setMedLogger(new MedLogger());
assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel);
}
diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
index 643a1d08069..d0ed7e7bc92 100644
--- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
+++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
@@ -3,8 +3,10 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.testutil.Assert.assertThrows;
@@ -15,7 +17,7 @@
import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.exceptions.CommandException;
-import seedu.address.model.AddressBook;
+import seedu.address.model.MedLogger;
import seedu.address.model.Model;
import seedu.address.model.person.NameContainsKeywordsPredicate;
import seedu.address.model.person.Person;
@@ -28,21 +30,31 @@ public class CommandTestUtil {
public static final String VALID_NAME_AMY = "Amy Bee";
public static final String VALID_NAME_BOB = "Bob Choo";
- public static final String VALID_PHONE_AMY = "11111111";
- public static final String VALID_PHONE_BOB = "22222222";
+ public static final String VALID_NRIC_AMY = "S1234566A";
+ public static final String VALID_NRIC_BOB = "S1234566B";
+ public static final String VALID_PHONE_AMY = "88888888";
+ public static final String VALID_PHONE_BOB = "99999999";
public static final String VALID_EMAIL_AMY = "amy@example.com";
public static final String VALID_EMAIL_BOB = "bob@example.com";
public static final String VALID_ADDRESS_AMY = "Block 312, Amy Street 1";
public static final String VALID_ADDRESS_BOB = "Block 123, Bobby Street 3";
+ public static final String VALID_DATE_AMY = "2025-01-01 11:11";
+ public static final String VALID_DATE_BOB = "2024-12-01 11:11";
public static final String VALID_TAG_HUSBAND = "husband";
public static final String VALID_TAG_FRIEND = "friend";
+ public static final String VALID_REMARK_AMY = "Like skiing.";
+ public static final String VALID_REMARK_BOB = "Favourite pastime: Eating";
public static final String NAME_DESC_AMY = " " + PREFIX_NAME + VALID_NAME_AMY;
public static final String NAME_DESC_BOB = " " + PREFIX_NAME + VALID_NAME_BOB;
+ public static final String NRIC_DESC_AMY = " " + PREFIX_NRIC + VALID_NRIC_AMY;
+ public static final String NRIC_DESC_BOB = " " + PREFIX_NRIC + VALID_NRIC_BOB;
public static final String PHONE_DESC_AMY = " " + PREFIX_PHONE + VALID_PHONE_AMY;
public static final String PHONE_DESC_BOB = " " + PREFIX_PHONE + VALID_PHONE_BOB;
public static final String EMAIL_DESC_AMY = " " + PREFIX_EMAIL + VALID_EMAIL_AMY;
public static final String EMAIL_DESC_BOB = " " + PREFIX_EMAIL + VALID_EMAIL_BOB;
+ public static final String DATE_DESC_AMY = " " + PREFIX_DATE + VALID_DATE_AMY;
+ public static final String DATE_DESC_BOB = " " + PREFIX_DATE + VALID_DATE_BOB;
public static final String ADDRESS_DESC_AMY = " " + PREFIX_ADDRESS + VALID_ADDRESS_AMY;
public static final String ADDRESS_DESC_BOB = " " + PREFIX_ADDRESS + VALID_ADDRESS_BOB;
public static final String TAG_DESC_FRIEND = " " + PREFIX_TAG + VALID_TAG_FRIEND;
@@ -52,21 +64,22 @@ public class CommandTestUtil {
public static final String INVALID_PHONE_DESC = " " + PREFIX_PHONE + "911a"; // 'a' not allowed in phones
public static final String INVALID_EMAIL_DESC = " " + PREFIX_EMAIL + "bob!yahoo"; // missing '@' symbol
public static final String INVALID_ADDRESS_DESC = " " + PREFIX_ADDRESS; // empty string not allowed for addresses
+ public static final String INVALID_DATE_DESC = " " + PREFIX_DATE + "2024/12/31";
public static final String INVALID_TAG_DESC = " " + PREFIX_TAG + "hubby*"; // '*' not allowed in tags
public static final String PREAMBLE_WHITESPACE = "\t \r \n";
public static final String PREAMBLE_NON_EMPTY = "NonEmptyPreamble";
- public static final EditCommand.EditPersonDescriptor DESC_AMY;
- public static final EditCommand.EditPersonDescriptor DESC_BOB;
+ public static final EditPersonCommand.EditPersonDescriptor DESC_AMY;
+ public static final EditPersonCommand.EditPersonDescriptor DESC_BOB;
static {
DESC_AMY = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)
.withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)
- .withTags(VALID_TAG_FRIEND).build();
+ .withNric(VALID_NRIC_AMY).withTags(VALID_TAG_FRIEND).build();
DESC_BOB = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)
.withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)
- .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();
+ .withNric(VALID_NRIC_AMY).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();
}
/**
@@ -99,21 +112,21 @@ public static void assertCommandSuccess(Command command, Model actualModel, Stri
* Executes the given {@code command}, confirms that
* - a {@code CommandException} is thrown
* - the CommandException message matches {@code expectedMessage}
- * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged
+ * - the Med Logger, filtered person list and selected person in {@code actualModel} remain unchanged
*/
public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {
// we are unable to defensively copy the model for comparison later, so we can
// only do so by copying its components.
- AddressBook expectedAddressBook = new AddressBook(actualModel.getAddressBook());
+ MedLogger expectedMedLogger = new MedLogger(actualModel.getMedLogger());
List expectedFilteredList = new ArrayList<>(actualModel.getFilteredPersonList());
assertThrows(CommandException.class, expectedMessage, () -> command.execute(actualModel));
- assertEquals(expectedAddressBook, actualModel.getAddressBook());
+ assertEquals(expectedMedLogger, actualModel.getMedLogger());
assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());
}
/**
* Updates {@code model}'s filtered list to show only the person at the given {@code targetIndex} in the
- * {@code model}'s address book.
+ * {@code model}'s Med Logger.
*/
public static void showPersonAtIndex(Model model, Index targetIndex) {
assertTrue(targetIndex.getZeroBased() < model.getFilteredPersonList().size());
diff --git a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java
index b6f332eabca..4d533f3b2ca 100644
--- a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java
@@ -8,7 +8,7 @@
import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;
import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;
import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
import org.junit.jupiter.api.Test;
@@ -25,7 +25,7 @@
*/
public class DeleteCommandTest {
- private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
+ private Model model = new ModelManager(getTypicalMedLogger(), new UserPrefs());
@Test
public void execute_validIndexUnfilteredList_success() {
@@ -35,7 +35,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.getMedLogger(), new UserPrefs());
expectedModel.deletePerson(personToDelete);
assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);
@@ -59,7 +59,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.getMedLogger(), new UserPrefs());
expectedModel.deletePerson(personToDelete);
showNoPerson(expectedModel);
@@ -71,8 +71,8 @@ public void execute_invalidIndexFilteredList_throwsCommandException() {
showPersonAtIndex(model, INDEX_FIRST_PERSON);
Index outOfBoundIndex = INDEX_SECOND_PERSON;
- // ensures that outOfBoundIndex is still in bounds of address book list
- assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getPersonList().size());
+ // ensures that outOfBoundIndex is still in bounds of Med Logger list
+ assertTrue(outOfBoundIndex.getZeroBased() < model.getMedLogger().getPersonList().size());
DeleteCommand deleteCommand = new DeleteCommand(outOfBoundIndex);
diff --git a/src/test/java/seedu/address/logic/commands/EditCommandTest.java b/src/test/java/seedu/address/logic/commands/EditCommandTest.java
index 469dd97daa7..313930b0ba9 100644
--- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java
@@ -13,14 +13,14 @@
import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;
import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;
import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
import org.junit.jupiter.api.Test;
import seedu.address.commons.core.index.Index;
import seedu.address.logic.Messages;
-import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
-import seedu.address.model.AddressBook;
+import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;
+import seedu.address.model.MedLogger;
import seedu.address.model.Model;
import seedu.address.model.ModelManager;
import seedu.address.model.UserPrefs;
@@ -29,21 +29,22 @@
import seedu.address.testutil.PersonBuilder;
/**
- * Contains integration tests (interaction with the Model) and unit tests for EditCommand.
+ * Contains integration tests (interaction with the Model) and unit tests for EditPersonCommand.
*/
public class EditCommandTest {
- private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
+ private Model model = new ModelManager(getTypicalMedLogger(), new UserPrefs());
@Test
public void execute_allFieldsSpecifiedUnfilteredList_success() {
Person editedPerson = new PersonBuilder().build();
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(editedPerson).build();
- EditCommand editCommand = new EditCommand(INDEX_FIRST_PERSON, descriptor);
+ EditPersonCommand editCommand = new EditPersonCommand(INDEX_FIRST_PERSON, descriptor);
- String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));
+ String expectedMessage = String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,
+ Messages.format(editedPerson));
- Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ Model expectedModel = new ModelManager(new MedLogger(model.getMedLogger()), new UserPrefs());
expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);
assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);
@@ -60,11 +61,12 @@ public void execute_someFieldsSpecifiedUnfilteredList_success() {
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)
.withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).build();
- EditCommand editCommand = new EditCommand(indexLastPerson, descriptor);
+ EditPersonCommand editCommand = new EditPersonCommand(indexLastPerson, descriptor);
- String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));
+ String expectedMessage = String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,
+ Messages.format(editedPerson));
- Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ Model expectedModel = new ModelManager(new MedLogger(model.getMedLogger()), new UserPrefs());
expectedModel.setPerson(lastPerson, editedPerson);
assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);
@@ -72,12 +74,13 @@ public void execute_someFieldsSpecifiedUnfilteredList_success() {
@Test
public void execute_noFieldSpecifiedUnfilteredList_success() {
- EditCommand editCommand = new EditCommand(INDEX_FIRST_PERSON, new EditPersonDescriptor());
+ EditPersonCommand editCommand = new EditPersonCommand(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(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,
+ Messages.format(editedPerson));
- Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ Model expectedModel = new ModelManager(new MedLogger(model.getMedLogger()), new UserPrefs());
assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);
}
@@ -88,12 +91,13 @@ public void execute_filteredList_success() {
Person personInFilteredList = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());
Person editedPerson = new PersonBuilder(personInFilteredList).withName(VALID_NAME_BOB).build();
- EditCommand editCommand = new EditCommand(INDEX_FIRST_PERSON,
+ EditPersonCommand editCommand = new EditPersonCommand(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(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,
+ Messages.format(editedPerson));
- Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ Model expectedModel = new ModelManager(new MedLogger(model.getMedLogger()), new UserPrefs());
expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);
assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);
@@ -103,44 +107,44 @@ public void execute_filteredList_success() {
public void execute_duplicatePersonUnfilteredList_failure() {
Person firstPerson = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(firstPerson).build();
- EditCommand editCommand = new EditCommand(INDEX_SECOND_PERSON, descriptor);
+ EditPersonCommand editCommand = new EditPersonCommand(INDEX_SECOND_PERSON, descriptor);
- assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);
+ assertCommandFailure(editCommand, model, EditPersonCommand.MESSAGE_DUPLICATE_PERSON);
}
@Test
public void execute_duplicatePersonFilteredList_failure() {
showPersonAtIndex(model, INDEX_FIRST_PERSON);
- // edit person in filtered list into a duplicate in address book
- Person personInList = model.getAddressBook().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());
- EditCommand editCommand = new EditCommand(INDEX_FIRST_PERSON,
+ // edit person in filtered list into a duplicate in Med Logger
+ Person personInList = model.getMedLogger().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());
+ EditPersonCommand editCommand = new EditPersonCommand(INDEX_FIRST_PERSON,
new EditPersonDescriptorBuilder(personInList).build());
- assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);
+ assertCommandFailure(editCommand, model, EditPersonCommand.MESSAGE_DUPLICATE_PERSON);
}
@Test
public void execute_invalidPersonIndexUnfilteredList_failure() {
Index outOfBoundIndex = Index.fromOneBased(model.getFilteredPersonList().size() + 1);
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build();
- EditCommand editCommand = new EditCommand(outOfBoundIndex, descriptor);
+ EditPersonCommand editCommand = new EditPersonCommand(outOfBoundIndex, descriptor);
assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
}
/**
* Edit filtered list where index is larger than size of filtered list,
- * but smaller than size of address book
+ * but smaller than size of Med Logger
*/
@Test
public void execute_invalidPersonIndexFilteredList_failure() {
showPersonAtIndex(model, INDEX_FIRST_PERSON);
Index outOfBoundIndex = INDEX_SECOND_PERSON;
- // ensures that outOfBoundIndex is still in bounds of address book list
- assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getPersonList().size());
+ // ensures that outOfBoundIndex is still in bounds of Med Logger list
+ assertTrue(outOfBoundIndex.getZeroBased() < model.getMedLogger().getPersonList().size());
- EditCommand editCommand = new EditCommand(outOfBoundIndex,
+ EditPersonCommand editCommand = new EditPersonCommand(outOfBoundIndex,
new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());
assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -148,11 +152,11 @@ public void execute_invalidPersonIndexFilteredList_failure() {
@Test
public void equals() {
- final EditCommand standardCommand = new EditCommand(INDEX_FIRST_PERSON, DESC_AMY);
+ final EditPersonCommand standardCommand = new EditPersonCommand(INDEX_FIRST_PERSON, DESC_AMY);
// same values -> returns true
EditPersonDescriptor copyDescriptor = new EditPersonDescriptor(DESC_AMY);
- EditCommand commandWithSameValues = new EditCommand(INDEX_FIRST_PERSON, copyDescriptor);
+ EditPersonCommand commandWithSameValues = new EditPersonCommand(INDEX_FIRST_PERSON, copyDescriptor);
assertTrue(standardCommand.equals(commandWithSameValues));
// same object -> returns true
@@ -165,18 +169,18 @@ public void equals() {
assertFalse(standardCommand.equals(new ClearCommand()));
// different index -> returns false
- assertFalse(standardCommand.equals(new EditCommand(INDEX_SECOND_PERSON, DESC_AMY)));
+ assertFalse(standardCommand.equals(new EditPersonCommand(INDEX_SECOND_PERSON, DESC_AMY)));
// different descriptor -> returns false
- assertFalse(standardCommand.equals(new EditCommand(INDEX_FIRST_PERSON, DESC_BOB)));
+ assertFalse(standardCommand.equals(new EditPersonCommand(INDEX_FIRST_PERSON, DESC_BOB)));
}
@Test
public void toStringMethod() {
Index index = Index.fromOneBased(1);
EditPersonDescriptor editPersonDescriptor = new EditPersonDescriptor();
- EditCommand editCommand = new EditCommand(index, editPersonDescriptor);
- String expected = EditCommand.class.getCanonicalName() + "{index=" + index + ", editPersonDescriptor="
+ EditPersonCommand editCommand = new EditPersonCommand(index, editPersonDescriptor);
+ String expected = EditPersonCommand.class.getCanonicalName() + "{index=" + index + ", editPersonDescriptor="
+ editPersonDescriptor + "}";
assertEquals(expected, editCommand.toString());
}
diff --git a/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java b/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java
index b17c1f3d5c2..163b687c7c5 100644
--- a/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java
+++ b/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java
@@ -13,7 +13,7 @@
import org.junit.jupiter.api.Test;
-import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
+import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;
import seedu.address.testutil.EditPersonDescriptorBuilder;
public class EditPersonDescriptorTest {
@@ -61,7 +61,8 @@ public void equals() {
public void toStringMethod() {
EditPersonDescriptor editPersonDescriptor = new EditPersonDescriptor();
String expected = EditPersonDescriptor.class.getCanonicalName() + "{name="
- + editPersonDescriptor.getName().orElse(null) + ", phone="
+ + editPersonDescriptor.getName().orElse(null) + ", NRIC="
+ + editPersonDescriptor.getNric().orElse(null) + ", phone="
+ editPersonDescriptor.getPhone().orElse(null) + ", email="
+ editPersonDescriptor.getEmail().orElse(null) + ", address="
+ editPersonDescriptor.getAddress().orElse(null) + ", tags="
diff --git a/src/test/java/seedu/address/logic/commands/ExportCommandTest.java b/src/test/java/seedu/address/logic/commands/ExportCommandTest.java
new file mode 100644
index 00000000000..f65f9f0b986
--- /dev/null
+++ b/src/test/java/seedu/address/logic/commands/ExportCommandTest.java
@@ -0,0 +1,34 @@
+package seedu.address.logic.commands;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class ExportCommandTest {
+
+ /**
+ * The ExportCommand class is UI-dependent, so the execute function is not tested.
+ */
+
+ @Test
+ public void equals_sameFileType_returnsTrue() {
+ ExportCommand a = new ExportCommand("json");
+ ExportCommand b = new ExportCommand("json");
+ assertEquals(a, b);
+ }
+
+ @Test
+ public void equals_differentType_returnsFalse() {
+ ExportCommand a = new ExportCommand("csv");
+ ExportCommand b = new ExportCommand("json");
+ assertNotEquals(a, b);
+ }
+
+ @Test
+ public void equals_duplicateFileType_returnsTrue() {
+ ExportCommand a = new ExportCommand("json");
+ ExportCommand b = new ExportCommand("json json");
+ assertNotEquals(a, b);
+ }
+}
diff --git a/src/test/java/seedu/address/logic/commands/FindCommandTest.java b/src/test/java/seedu/address/logic/commands/FindCommandTest.java
index b8b7dbba91a..f6871d4843f 100644
--- a/src/test/java/seedu/address/logic/commands/FindCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/FindCommandTest.java
@@ -8,7 +8,7 @@
import static seedu.address.testutil.TypicalPersons.CARL;
import static seedu.address.testutil.TypicalPersons.ELLE;
import static seedu.address.testutil.TypicalPersons.FIONA;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
import java.util.Arrays;
import java.util.Collections;
@@ -24,8 +24,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(getTypicalMedLogger(), new UserPrefs());
+ private Model expectedModel = new ModelManager(getTypicalMedLogger(), 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..4171badc7c4 100644
--- a/src/test/java/seedu/address/logic/commands/ListCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/ListCommandTest.java
@@ -3,7 +3,7 @@
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;
import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -22,8 +22,8 @@ public class ListCommandTest {
@BeforeEach
public void setUp() {
- model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
- expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs());
+ model = new ModelManager(getTypicalMedLogger(), new UserPrefs());
+ expectedModel = new ModelManager(model.getMedLogger(), new UserPrefs());
}
@Test
diff --git a/src/test/java/seedu/address/logic/commands/RemarkCommandTest.java b/src/test/java/seedu/address/logic/commands/RemarkCommandTest.java
new file mode 100644
index 00000000000..b1285d5662f
--- /dev/null
+++ b/src/test/java/seedu/address/logic/commands/RemarkCommandTest.java
@@ -0,0 +1,131 @@
+package seedu.address.logic.commands;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_REMARK_AMY;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_REMARK_BOB;
+import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;
+import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
+import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;
+import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;
+import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.Messages;
+import seedu.address.model.MedLogger;
+import seedu.address.model.Model;
+import seedu.address.model.ModelManager;
+import seedu.address.model.UserPrefs;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Remark;
+import seedu.address.testutil.PersonBuilder;
+
+public class RemarkCommandTest {
+
+ private static final String REMARK_STUB = "Some remark";
+
+ private Model model = new ModelManager(getTypicalMedLogger(), new UserPrefs());
+
+ @Test
+ public void execute_addRemarkUnfilteredList_success() {
+ Person firstPerson = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());
+ Person editedPerson = new PersonBuilder(firstPerson).withRemark(REMARK_STUB).build();
+
+ RemarkCommand remarkCommand = new RemarkCommand(INDEX_FIRST_PERSON, new Remark(editedPerson.getRemark().value));
+
+ String expectedMessage = String.format(RemarkCommand.MESSAGE_ADD_REMARK_SUCCESS, Messages.format(editedPerson));
+
+ Model expectedModel = new ModelManager(new MedLogger(model.getMedLogger()), new UserPrefs());
+ expectedModel.setPerson(firstPerson, editedPerson);
+
+ assertCommandSuccess(remarkCommand, model, expectedMessage, expectedModel);
+ }
+
+ @Test
+ public void execute_deleteRemarkUnfilteredList_success() {
+ Person firstPerson = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());
+ Person editedPerson = new PersonBuilder(firstPerson).withRemark("").build();
+
+ RemarkCommand remarkCommand = new RemarkCommand(INDEX_FIRST_PERSON,
+ new Remark(editedPerson.getRemark().toString()));
+
+ String expectedMessage = String.format(RemarkCommand.MESSAGE_DELETE_REMARK_SUCCESS,
+ Messages.format(editedPerson));
+
+ Model expectedModel = new ModelManager(new MedLogger(model.getMedLogger()), new UserPrefs());
+ expectedModel.setPerson(firstPerson, editedPerson);
+
+ assertCommandSuccess(remarkCommand, model, expectedMessage, expectedModel);
+ }
+
+ @Test
+ public void execute_filteredList_success() {
+ showPersonAtIndex(model, INDEX_FIRST_PERSON);
+
+ Person firstPerson = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());
+ Person editedPerson = new PersonBuilder(model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased()))
+ .withRemark(REMARK_STUB).build();
+
+ RemarkCommand remarkCommand = new RemarkCommand(INDEX_FIRST_PERSON, new Remark(editedPerson.getRemark().value));
+
+ String expectedMessage = String.format(RemarkCommand.MESSAGE_ADD_REMARK_SUCCESS, Messages.format(editedPerson));
+
+ Model expectedModel = new ModelManager(new MedLogger(model.getMedLogger()), new UserPrefs());
+ expectedModel.setPerson(firstPerson, editedPerson);
+
+ assertCommandSuccess(remarkCommand, model, expectedMessage, expectedModel);
+ }
+
+ @Test
+ public void execute_invalidPersonIndexUnfilteredList_failure() {
+ Index outOfBoundIndex = Index.fromOneBased(model.getFilteredPersonList().size() + 1);
+ RemarkCommand remarkCommand = new RemarkCommand(outOfBoundIndex, new Remark(VALID_REMARK_BOB));
+
+ assertCommandFailure(remarkCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
+ }
+
+ /**
+ * Edit filtered list where index is larger than size of filtered list,
+ * but smaller than size of address book
+ */
+ @Test
+ public void execute_invalidPersonIndexFilteredList_failure() {
+ showPersonAtIndex(model, INDEX_FIRST_PERSON);
+ Index outOfBoundIndex = INDEX_SECOND_PERSON;
+ // ensures that outOfBoundIndex is still in bounds of address book list
+ assertTrue(outOfBoundIndex.getZeroBased() < model.getMedLogger().getPersonList().size());
+
+ RemarkCommand remarkCommand = new RemarkCommand(outOfBoundIndex, new Remark(VALID_REMARK_BOB));
+
+ assertCommandFailure(remarkCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
+
+ }
+
+ @Test
+ public void equals() {
+ final RemarkCommand standardCommand = new RemarkCommand(INDEX_FIRST_PERSON, new Remark(VALID_REMARK_AMY));
+
+ // same values -> returns true
+ RemarkCommand commandWithSameValues = new RemarkCommand(INDEX_FIRST_PERSON, new Remark(VALID_REMARK_AMY));
+ assertTrue(standardCommand.equals(commandWithSameValues));
+
+ // same object -> returns true
+ assertTrue(standardCommand.equals(standardCommand));
+
+ // null -> returns false
+ assertFalse(standardCommand.equals(null));
+
+ // different types -> returns false
+ assertFalse(standardCommand.equals(new ClearCommand()));
+
+ // different index -> returns false
+ assertFalse(standardCommand.equals(new RemarkCommand(INDEX_SECOND_PERSON, new Remark(VALID_REMARK_AMY))));
+
+ // different remark -> returns false
+ assertFalse(standardCommand.equals(new RemarkCommand(INDEX_FIRST_PERSON, new Remark(VALID_REMARK_BOB))));
+ }
+
+}
diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddPersonCommandParserTest.java
similarity index 72%
rename from src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
rename to src/test/java/seedu/address/logic/parser/AddPersonCommandParserTest.java
index 5bc11d3cdaa..d81e0c43995 100644
--- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/AddPersonCommandParserTest.java
@@ -12,6 +12,8 @@
import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;
+import static seedu.address.logic.commands.CommandTestUtil.NRIC_DESC_AMY;
+import static seedu.address.logic.commands.CommandTestUtil.NRIC_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;
@@ -27,6 +29,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;
import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;
@@ -36,7 +39,7 @@
import org.junit.jupiter.api.Test;
import seedu.address.logic.Messages;
-import seedu.address.logic.commands.AddCommand;
+import seedu.address.logic.commands.AddPersonCommand;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
@@ -45,30 +48,30 @@
import seedu.address.model.tag.Tag;
import seedu.address.testutil.PersonBuilder;
-public class AddCommandParserTest {
- private AddCommandParser parser = new AddCommandParser();
+public class AddPersonCommandParserTest {
+ private AddPersonCommandParser parser = new AddPersonCommandParser();
@Test
public void parse_allFieldsPresent_success() {
Person expectedPerson = new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND).build();
// whitespace only preamble
- assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
+ assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB
+ + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddPersonCommand(expectedPerson));
// multiple tags - all accepted
Person expectedPersonMultipleTags = new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)
.build();
assertParseSuccess(parser,
- NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,
- new AddCommand(expectedPersonMultipleTags));
+ NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
+ + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, new AddPersonCommand(expectedPersonMultipleTags));
}
@Test
public void parse_repeatedNonTagValue_failure() {
- String validExpectedPersonString = NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;
+ String validExpectedPersonString = NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB
+ + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;
// multiple names
assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,
@@ -88,9 +91,10 @@ public void parse_repeatedNonTagValue_failure() {
// multiple fields repeated
assertParseFailure(parser,
- validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY
- + validExpectedPersonString,
- Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE));
+ validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY
+ + ADDRESS_DESC_AMY + validExpectedPersonString,
+ Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_NRIC, PREFIX_ADDRESS,
+ PREFIX_EMAIL, PREFIX_PHONE));
// invalid value followed by valid value
@@ -133,13 +137,13 @@ public void parse_repeatedNonTagValue_failure() {
public void parse_optionalFieldsMissing_success() {
// zero tags
Person expectedPerson = new PersonBuilder(AMY).withTags().build();
- assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,
- new AddCommand(expectedPerson));
+ assertParseSuccess(parser, NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,
+ new AddPersonCommand(expectedPerson));
}
@Test
public void parse_compulsoryFieldMissing_failure() {
- String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);
+ String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE);
// missing name prefix
assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,
@@ -165,32 +169,36 @@ public void parse_compulsoryFieldMissing_failure() {
@Test
public void parse_invalidValue_failure() {
// invalid name
- assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
- + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);
+ assertParseFailure(parser, INVALID_NAME_DESC + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);
// invalid phone
- assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
- + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);
+ assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB
+ + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);
// invalid email
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB
- + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);
+ assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC
+ + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);
// invalid address
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC
- + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);
+ assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ + INVALID_ADDRESS_DESC + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);
+
+ // invalid date
+ //assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
+ // + INVALID_DATE_DESC + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, DateTime.MESSAGE_CONSTRAINTS);
// invalid tag
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
- + INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);
+ assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ + ADDRESS_DESC_BOB + INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);
// two invalid values, only first invalid value reported
- assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC,
- Name.MESSAGE_CONSTRAINTS);
+ assertParseFailure(parser, INVALID_NAME_DESC + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ + INVALID_ADDRESS_DESC, Name.MESSAGE_CONSTRAINTS);
// non-empty preamble
- assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,
- String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
+ assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB
+ + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,
+ String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE));
}
}
diff --git a/src/test/java/seedu/address/logic/parser/CommandParserTestUtil.java b/src/test/java/seedu/address/logic/parser/CommandParserTestUtil.java
index 9bf1ccf1cef..8f5830e3049 100644
--- a/src/test/java/seedu/address/logic/parser/CommandParserTestUtil.java
+++ b/src/test/java/seedu/address/logic/parser/CommandParserTestUtil.java
@@ -15,7 +15,7 @@ public class CommandParserTestUtil {
* equals to {@code expectedCommand}.
*/
public static void assertParseSuccess(Parser extends Command> parser, String userInput,
- Command expectedCommand) {
+ Command expectedCommand) {
try {
Command command = parser.parse(userInput);
assertEquals(expectedCommand, command);
diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditPersonCommandParserTest.java
similarity index 88%
rename from src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
rename to src/test/java/seedu/address/logic/parser/EditPersonCommandParserTest.java
index cc7175172d4..b3d7b629641 100644
--- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/EditPersonCommandParserTest.java
@@ -36,8 +36,8 @@
import seedu.address.commons.core.index.Index;
import seedu.address.logic.Messages;
-import seedu.address.logic.commands.EditCommand;
-import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
+import seedu.address.logic.commands.EditPersonCommand;
+import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
@@ -45,14 +45,14 @@
import seedu.address.model.tag.Tag;
import seedu.address.testutil.EditPersonDescriptorBuilder;
-public class EditCommandParserTest {
+public class EditPersonCommandParserTest {
private static final String TAG_EMPTY = " " + PREFIX_TAG;
private static final String MESSAGE_INVALID_FORMAT =
- String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);
+ String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditPersonCommand.MESSAGE_USAGE);
- private EditCommandParser parser = new EditCommandParser();
+ private EditPersonCommandParser parser = new EditPersonCommandParser();
@Test
public void parse_missingParts_failure() {
@@ -60,7 +60,7 @@ public void parse_missingParts_failure() {
assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);
// no field specified
- assertParseFailure(parser, "1", EditCommand.MESSAGE_NOT_EDITED);
+ assertParseFailure(parser, "1", EditPersonCommand.MESSAGE_NOT_EDITED);
// no index and no field specified
assertParseFailure(parser, "", MESSAGE_INVALID_FORMAT);
@@ -78,7 +78,7 @@ public void parse_invalidPreamble_failure() {
assertParseFailure(parser, "1 some random string", MESSAGE_INVALID_FORMAT);
// invalid prefix being parsed as preamble
- assertParseFailure(parser, "1 i/ string", MESSAGE_INVALID_FORMAT);
+ assertParseFailure(parser, "1 j/ string", MESSAGE_INVALID_FORMAT);
}
@Test
@@ -112,7 +112,7 @@ public void parse_allFieldsSpecified_success() {
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)
.withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)
.withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();
- EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
+ EditPersonCommand expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
}
@@ -124,7 +124,7 @@ public void parse_someFieldsSpecified_success() {
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)
.withEmail(VALID_EMAIL_AMY).build();
- EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
+ EditPersonCommand expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
}
@@ -135,38 +135,38 @@ public void parse_oneFieldSpecified_success() {
Index targetIndex = INDEX_THIRD_PERSON;
String userInput = targetIndex.getOneBased() + NAME_DESC_AMY;
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build();
- EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
+ EditPersonCommand expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
// phone
userInput = targetIndex.getOneBased() + PHONE_DESC_AMY;
descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build();
- expectedCommand = new EditCommand(targetIndex, descriptor);
+ expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
// email
userInput = targetIndex.getOneBased() + EMAIL_DESC_AMY;
descriptor = new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build();
- expectedCommand = new EditCommand(targetIndex, descriptor);
+ expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
// address
userInput = targetIndex.getOneBased() + ADDRESS_DESC_AMY;
descriptor = new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();
- expectedCommand = new EditCommand(targetIndex, descriptor);
+ expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
// tags
userInput = targetIndex.getOneBased() + TAG_DESC_FRIEND;
descriptor = new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build();
- expectedCommand = new EditCommand(targetIndex, descriptor);
+ expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
}
@Test
public void parse_multipleRepeatedFields_failure() {
// More extensive testing of duplicate parameter detections is done in
- // AddCommandParserTest#parse_repeatedNonTagValue_failure()
+ // AddPersonCommandParserTest#parse_repeatedNonTagValue_failure()
// valid followed by invalid
Index targetIndex = INDEX_FIRST_PERSON;
@@ -201,7 +201,7 @@ public void parse_resetTags_success() {
String userInput = targetIndex.getOneBased() + TAG_EMPTY;
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withTags().build();
- EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
+ EditPersonCommand expectedCommand = new EditPersonCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
}
diff --git a/src/test/java/seedu/address/logic/parser/ExportCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ExportCommandParserTest.java
new file mode 100644
index 00000000000..768ee7b8854
--- /dev/null
+++ b/src/test/java/seedu/address/logic/parser/ExportCommandParserTest.java
@@ -0,0 +1,27 @@
+package seedu.address.logic.parser;
+
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.commands.ExportCommand.CSV_TYPE;
+import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;
+import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.logic.commands.ExportCommand;
+
+public class ExportCommandParserTest {
+ private ExportCommandParser parser = new ExportCommandParser();
+
+ @Test
+ public void parse_correctCsvInput_success() {
+ ExportCommand expectedCommand = new ExportCommand(CSV_TYPE);
+ assertParseSuccess(parser, CSV_TYPE, expectedCommand);
+ }
+
+ @Test
+ public void parse_inCorrectInput_failure() {
+ String userInput = "something " + CSV_TYPE;
+ assertParseFailure(parser, userInput, String.format(MESSAGE_INVALID_COMMAND_FORMAT,
+ ExportCommand.MESSAGE_USAGE));
+ }
+}
diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/MedLoggerParserTest.java
similarity index 65%
rename from src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
rename to src/test/java/seedu/address/logic/parser/MedLoggerParserTest.java
index 5a1ab3dbc0c..a4001d2898a 100644
--- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/MedLoggerParserTest.java
@@ -4,6 +4,9 @@
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;
+import static seedu.address.logic.commands.ExportCommand.CSV_TYPE;
+import static seedu.address.logic.commands.ExportCommand.JSON_TYPE;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
import static seedu.address.testutil.Assert.assertThrows;
import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;
@@ -13,31 +16,34 @@
import org.junit.jupiter.api.Test;
-import seedu.address.logic.commands.AddCommand;
+import seedu.address.logic.commands.AddPersonCommand;
import seedu.address.logic.commands.ClearCommand;
import seedu.address.logic.commands.DeleteCommand;
-import seedu.address.logic.commands.EditCommand;
-import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
+import seedu.address.logic.commands.EditPersonCommand;
+import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;
import seedu.address.logic.commands.ExitCommand;
+import seedu.address.logic.commands.ExportCommand;
import seedu.address.logic.commands.FindCommand;
import seedu.address.logic.commands.HelpCommand;
import seedu.address.logic.commands.ListCommand;
+import seedu.address.logic.commands.RemarkCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.NameContainsKeywordsPredicate;
import seedu.address.model.person.Person;
+import seedu.address.model.person.Remark;
import seedu.address.testutil.EditPersonDescriptorBuilder;
import seedu.address.testutil.PersonBuilder;
import seedu.address.testutil.PersonUtil;
-public class AddressBookParserTest {
+public class MedLoggerParserTest {
- private final AddressBookParser parser = new AddressBookParser();
+ private final MedLoggerParser parser = new MedLoggerParser();
@Test
public void parseCommand_add() throws Exception {
Person person = new PersonBuilder().build();
- AddCommand command = (AddCommand) parser.parseCommand(PersonUtil.getAddCommand(person));
- assertEquals(new AddCommand(person), command);
+ AddPersonCommand command = (AddPersonCommand) parser.parseCommand(PersonUtil.getAddCommand(person));
+ assertEquals(new AddPersonCommand(person), command);
}
@Test
@@ -57,9 +63,9 @@ public void parseCommand_delete() throws Exception {
public void parseCommand_edit() throws Exception {
Person person = new PersonBuilder().build();
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(person).build();
- EditCommand command = (EditCommand) parser.parseCommand(EditCommand.COMMAND_WORD + " "
+ EditPersonCommand command = (EditPersonCommand) parser.parseCommand(EditPersonCommand.COMMAND_WORD + " "
+ INDEX_FIRST_PERSON.getOneBased() + " " + PersonUtil.getEditPersonDescriptorDetails(descriptor));
- assertEquals(new EditCommand(INDEX_FIRST_PERSON, descriptor), command);
+ assertEquals(new EditPersonCommand(INDEX_FIRST_PERSON, descriptor), command);
}
@Test
@@ -85,13 +91,29 @@ public void parseCommand_help() throws Exception {
@Test
public void parseCommand_list() throws Exception {
assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD) instanceof ListCommand);
- assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD + " 3") instanceof ListCommand);
+ assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD + " l/1") instanceof ListCommand);
+ assertThrows(ParseException.class, () -> parser.parseCommand(ListCommand.COMMAND_WORD + " 3"));
+ }
+
+ @Test
+ public void parseCommand_remark() throws Exception {
+ final Remark remark = new Remark("Some remark.");
+ RemarkCommand command = (RemarkCommand) parser.parseCommand(RemarkCommand.COMMAND_WORD + " "
+ + INDEX_FIRST_PERSON.getOneBased() + " " + PREFIX_REMARK + remark.value);
+ assertEquals(new RemarkCommand(INDEX_FIRST_PERSON, remark), command);
+ }
+
+ @Test
+ public void parseCommand_export() throws Exception {
+ assertTrue(parser.parseCommand(ExportCommand.COMMAND_WORD + " " + CSV_TYPE) instanceof ExportCommand);
+ assertTrue(parser.parseCommand(ExportCommand.COMMAND_WORD + " " + JSON_TYPE) instanceof ExportCommand);
+ assertThrows(ParseException.class, () -> parser.parseCommand(ExportCommand.COMMAND_WORD + " 3 4 5"));
}
@Test
public void parseCommand_unrecognisedInput_throwsParseException() {
assertThrows(ParseException.class, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE), ()
- -> parser.parseCommand(""));
+ -> parser.parseCommand(""));
}
@Test
diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
index 4256788b1a7..0c72b39007a 100644
--- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
+++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
@@ -1,5 +1,6 @@
package seedu.address.logic.parser;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static seedu.address.logic.parser.ParserUtil.MESSAGE_INVALID_INDEX;
@@ -28,7 +29,7 @@ public class ParserUtilTest {
private static final String INVALID_TAG = "#friend";
private static final String VALID_NAME = "Rachel Walker";
- private static final String VALID_PHONE = "123456";
+ private static final String VALID_PHONE = "87123456";
private static final String VALID_ADDRESS = "123 Main Street #0505";
private static final String VALID_EMAIL = "rachel@example.com";
private static final String VALID_TAG_1 = "friend";
@@ -193,4 +194,50 @@ public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception {
assertEquals(expectedTagSet, actualTagSet);
}
+
+ @Test
+ public void parseAll_emptyString_returnsEmptyArray() {
+ String[] result = ParserUtil.parseAll("");
+ assertEquals(0, result.length);
+ }
+
+ @Test
+ public void parseAll_spacesOnly_returnsEmptyArray() {
+ String[] result = ParserUtil.parseAll(" ");
+ assertEquals(0, result.length);
+ }
+
+ @Test
+ public void parseAll_singleWord_returnsArrayWithOneElement() {
+ String[] result = ParserUtil.parseAll("json");
+ assertArrayEquals(new String[]{"json"}, result);
+ }
+
+ @Test
+ public void parseAll_multipleWords_returnsSplitArray() {
+ String[] result = ParserUtil.parseAll(" csv json xml ");
+ assertArrayEquals(new String[]{"csv", "json", "xml"}, result);
+ }
+
+ @Test
+ public void parseFileType_validSingleWord_returnsWord() throws ParseException {
+ String result = ParserUtil.parseFileType("csv");
+ assertEquals("csv", result);
+ }
+
+ @Test
+ public void parseFileType_validWordWithSpaces_returnsWord() throws ParseException {
+ String result = ParserUtil.parseFileType(" json ");
+ assertEquals("json", result);
+ }
+
+ @Test
+ public void parseFileType_twoWord_throwsParseException() throws ParseException {
+ assertThrows(ParseException.class, () -> ParserUtil.parseFileType("json csv"));
+ }
+
+ @Test
+ public void parseFileType_emptyWord_throwsParseException() throws ParseException {
+ assertThrows(ParseException.class, () -> ParserUtil.parseFileType(""));
+ }
}
diff --git a/src/test/java/seedu/address/logic/parser/RemarkCommandParserTest.java b/src/test/java/seedu/address/logic/parser/RemarkCommandParserTest.java
new file mode 100644
index 00000000000..b2c9eb5b156
--- /dev/null
+++ b/src/test/java/seedu/address/logic/parser/RemarkCommandParserTest.java
@@ -0,0 +1,30 @@
+package seedu.address.logic.parser;
+
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;
+import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.commands.RemarkCommand;
+import seedu.address.model.person.Remark;
+
+public class RemarkCommandParserTest {
+ private RemarkCommandParser parser = new RemarkCommandParser();
+ private final String nonEmptyRemark = "Some remark.";
+
+ @Test
+ public void parse_indexSpecified_success() {
+ // have remark
+ Index targetIndex = INDEX_FIRST_PERSON;
+ String userInput = targetIndex.getOneBased() + " " + PREFIX_REMARK + nonEmptyRemark;
+ RemarkCommand expectedCommand = new RemarkCommand(INDEX_FIRST_PERSON, new Remark(nonEmptyRemark));
+ assertParseSuccess(parser, userInput, expectedCommand);
+
+ // no remark
+ userInput = targetIndex.getOneBased() + " " + PREFIX_REMARK;
+ expectedCommand = new RemarkCommand(INDEX_FIRST_PERSON, new Remark(""));
+ assertParseSuccess(parser, userInput, expectedCommand);
+ }
+}
diff --git a/src/test/java/seedu/address/model/AddressBookTest.java b/src/test/java/seedu/address/model/MedLoggerTest.java
similarity index 50%
rename from src/test/java/seedu/address/model/AddressBookTest.java
rename to src/test/java/seedu/address/model/MedLoggerTest.java
index 68c8c5ba4d5..9449b91569c 100644
--- a/src/test/java/seedu/address/model/AddressBookTest.java
+++ b/src/test/java/seedu/address/model/MedLoggerTest.java
@@ -7,7 +7,7 @@
import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;
import static seedu.address.testutil.Assert.assertThrows;
import static seedu.address.testutil.TypicalPersons.ALICE;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
import java.util.Arrays;
import java.util.Collection;
@@ -19,28 +19,30 @@
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import seedu.address.model.person.Person;
+import seedu.address.model.person.PersonVisitDictionary;
+import seedu.address.model.person.Visit;
import seedu.address.model.person.exceptions.DuplicatePersonException;
import seedu.address.testutil.PersonBuilder;
-public class AddressBookTest {
+public class MedLoggerTest {
- private final AddressBook addressBook = new AddressBook();
+ private final MedLogger medLogger = new MedLogger();
@Test
public void constructor() {
- assertEquals(Collections.emptyList(), addressBook.getPersonList());
+ assertEquals(Collections.emptyList(), medLogger.getPersonList());
}
@Test
public void resetData_null_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> addressBook.resetData(null));
+ assertThrows(NullPointerException.class, () -> medLogger.resetData(null));
}
@Test
- public void resetData_withValidReadOnlyAddressBook_replacesData() {
- AddressBook newData = getTypicalAddressBook();
- addressBook.resetData(newData);
- assertEquals(newData, addressBook);
+ public void resetData_withValidReadOnlyMedLogger_replacesData() {
+ MedLogger newData = getTypicalMedLogger();
+ medLogger.resetData(newData);
+ assertEquals(newData, medLogger);
}
@Test
@@ -49,53 +51,56 @@ public void resetData_withDuplicatePersons_throwsDuplicatePersonException() {
Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)
.build();
List newPersons = Arrays.asList(ALICE, editedAlice);
- AddressBookStub newData = new AddressBookStub(newPersons);
+ MedLoggerStub newData = new MedLoggerStub(newPersons);
- assertThrows(DuplicatePersonException.class, () -> addressBook.resetData(newData));
+ assertThrows(DuplicatePersonException.class, () -> medLogger.resetData(newData));
}
@Test
public void hasPerson_nullPerson_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> addressBook.hasPerson(null));
+ assertThrows(NullPointerException.class, () -> medLogger.hasPerson(null));
}
@Test
- public void hasPerson_personNotInAddressBook_returnsFalse() {
- assertFalse(addressBook.hasPerson(ALICE));
+ public void hasPerson_personNotInMedLogger_returnsFalse() {
+ assertFalse(medLogger.hasPerson(ALICE));
}
@Test
- public void hasPerson_personInAddressBook_returnsTrue() {
- addressBook.addPerson(ALICE);
- assertTrue(addressBook.hasPerson(ALICE));
+ public void hasPerson_personInMedLogger_returnsTrue() {
+ medLogger.addPerson(ALICE);
+ assertTrue(medLogger.hasPerson(ALICE));
}
@Test
- public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() {
- addressBook.addPerson(ALICE);
+ public void hasPerson_personWithSameIdentityFieldsInMedLogger_returnsTrue() {
+ medLogger.addPerson(ALICE);
Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)
.build();
- assertTrue(addressBook.hasPerson(editedAlice));
+ assertTrue(medLogger.hasPerson(editedAlice));
}
@Test
public void getPersonList_modifyList_throwsUnsupportedOperationException() {
- assertThrows(UnsupportedOperationException.class, () -> addressBook.getPersonList().remove(0));
+ assertThrows(UnsupportedOperationException.class, () -> medLogger.getPersonList().remove(0));
}
@Test
public void toStringMethod() {
- String expected = AddressBook.class.getCanonicalName() + "{persons=" + addressBook.getPersonList() + "}";
- assertEquals(expected, addressBook.toString());
+ String expected = MedLogger.class.getCanonicalName() + "{persons=" + medLogger.getPersonList()
+ + ", visits=" + medLogger.getVisitList() + "}";
+ assertEquals(expected, medLogger.toString());
}
/**
- * A stub ReadOnlyAddressBook whose persons list can violate interface constraints.
+ * A stub ReadOnlyMedLogger whose persons list can violate interface constraints.
*/
- private static class AddressBookStub implements ReadOnlyAddressBook {
+ private static class MedLoggerStub implements ReadOnlyMedLogger {
private final ObservableList persons = FXCollections.observableArrayList();
+ private final ObservableList visits = FXCollections.observableArrayList();
+ private final PersonVisitDictionary dictionary = new PersonVisitDictionary();
- AddressBookStub(Collection persons) {
+ MedLoggerStub(Collection persons) {
this.persons.setAll(persons);
}
@@ -103,6 +108,15 @@ private static class AddressBookStub implements ReadOnlyAddressBook {
public ObservableList getPersonList() {
return persons;
}
- }
+ @Override
+ public ObservableList getVisitList() {
+ return visits;
+ }
+
+ @Override
+ public PersonVisitDictionary getDictionary() {
+ return dictionary;
+ }
+ }
}
diff --git a/src/test/java/seedu/address/model/ModelManagerTest.java b/src/test/java/seedu/address/model/ModelManagerTest.java
index 2cf1418d116..47981ee1053 100644
--- a/src/test/java/seedu/address/model/ModelManagerTest.java
+++ b/src/test/java/seedu/address/model/ModelManagerTest.java
@@ -16,7 +16,7 @@
import seedu.address.commons.core.GuiSettings;
import seedu.address.model.person.NameContainsKeywordsPredicate;
-import seedu.address.testutil.AddressBookBuilder;
+import seedu.address.testutil.MedLoggerBuilder;
public class ModelManagerTest {
@@ -26,7 +26,7 @@ public class ModelManagerTest {
public void constructor() {
assertEquals(new UserPrefs(), modelManager.getUserPrefs());
assertEquals(new GuiSettings(), modelManager.getGuiSettings());
- assertEquals(new AddressBook(), new AddressBook(modelManager.getAddressBook()));
+ assertEquals(new MedLogger(), new MedLogger(modelManager.getMedLogger()));
}
@Test
@@ -37,14 +37,14 @@ public void setUserPrefs_nullUserPrefs_throwsNullPointerException() {
@Test
public void setUserPrefs_validUserPrefs_copiesUserPrefs() {
UserPrefs userPrefs = new UserPrefs();
- userPrefs.setAddressBookFilePath(Paths.get("address/book/file/path"));
+ userPrefs.setMedLoggerFilePath(Paths.get("address/book/file/path"));
userPrefs.setGuiSettings(new GuiSettings(1, 2, 3, 4));
modelManager.setUserPrefs(userPrefs);
assertEquals(userPrefs, modelManager.getUserPrefs());
// Modifying userPrefs should not modify modelManager's userPrefs
UserPrefs oldUserPrefs = new UserPrefs(userPrefs);
- userPrefs.setAddressBookFilePath(Paths.get("new/address/book/file/path"));
+ userPrefs.setMedLoggerFilePath(Paths.get("new/address/book/file/path"));
assertEquals(oldUserPrefs, modelManager.getUserPrefs());
}
@@ -61,15 +61,15 @@ public void setGuiSettings_validGuiSettings_setsGuiSettings() {
}
@Test
- public void setAddressBookFilePath_nullPath_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> modelManager.setAddressBookFilePath(null));
+ public void setMedLoggerFilePath_nullPath_throwsNullPointerException() {
+ assertThrows(NullPointerException.class, () -> modelManager.setMedLoggerFilePath(null));
}
@Test
- public void setAddressBookFilePath_validPath_setsAddressBookFilePath() {
+ public void setMedLoggerFilePath_validPath_setsMedLoggerFilePath() {
Path path = Paths.get("address/book/file/path");
- modelManager.setAddressBookFilePath(path);
- assertEquals(path, modelManager.getAddressBookFilePath());
+ modelManager.setMedLoggerFilePath(path);
+ assertEquals(path, modelManager.getMedLoggerFilePath());
}
@Test
@@ -78,12 +78,12 @@ public void hasPerson_nullPerson_throwsNullPointerException() {
}
@Test
- public void hasPerson_personNotInAddressBook_returnsFalse() {
+ public void hasPerson_personNotInMedLogger_returnsFalse() {
assertFalse(modelManager.hasPerson(ALICE));
}
@Test
- public void hasPerson_personInAddressBook_returnsTrue() {
+ public void hasPerson_personInMedLogger_returnsTrue() {
modelManager.addPerson(ALICE);
assertTrue(modelManager.hasPerson(ALICE));
}
@@ -95,13 +95,13 @@ public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException
@Test
public void equals() {
- AddressBook addressBook = new AddressBookBuilder().withPerson(ALICE).withPerson(BENSON).build();
- AddressBook differentAddressBook = new AddressBook();
+ MedLogger medLogger = new MedLoggerBuilder().withPerson(ALICE).withPerson(BENSON).build();
+ MedLogger differentMedLogger = new MedLogger();
UserPrefs userPrefs = new UserPrefs();
// same values -> returns true
- modelManager = new ModelManager(addressBook, userPrefs);
- ModelManager modelManagerCopy = new ModelManager(addressBook, userPrefs);
+ modelManager = new ModelManager(medLogger, userPrefs);
+ ModelManager modelManagerCopy = new ModelManager(medLogger, userPrefs);
assertTrue(modelManager.equals(modelManagerCopy));
// same object -> returns true
@@ -113,20 +113,20 @@ public void equals() {
// different types -> returns false
assertFalse(modelManager.equals(5));
- // different addressBook -> returns false
- assertFalse(modelManager.equals(new ModelManager(differentAddressBook, userPrefs)));
+ // different medLogger -> returns false
+ assertFalse(modelManager.equals(new ModelManager(differentMedLogger, 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(medLogger, userPrefs)));
// resets modelManager to initial state for upcoming tests
modelManager.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
// different userPrefs -> returns false
UserPrefs differentUserPrefs = new UserPrefs();
- differentUserPrefs.setAddressBookFilePath(Paths.get("differentFilePath"));
- assertFalse(modelManager.equals(new ModelManager(addressBook, differentUserPrefs)));
+ differentUserPrefs.setMedLoggerFilePath(Paths.get("differentFilePath"));
+ assertFalse(modelManager.equals(new ModelManager(medLogger, differentUserPrefs)));
}
}
diff --git a/src/test/java/seedu/address/model/UserPrefsTest.java b/src/test/java/seedu/address/model/UserPrefsTest.java
index b1307a70d52..23c2de8d877 100644
--- a/src/test/java/seedu/address/model/UserPrefsTest.java
+++ b/src/test/java/seedu/address/model/UserPrefsTest.java
@@ -13,9 +13,9 @@ public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {
}
@Test
- public void setAddressBookFilePath_nullPath_throwsNullPointerException() {
+ public void setMedLoggerFilePath_nullPath_throwsNullPointerException() {
UserPrefs userPrefs = new UserPrefs();
- assertThrows(NullPointerException.class, () -> userPrefs.setAddressBookFilePath(null));
+ assertThrows(NullPointerException.class, () -> userPrefs.setMedLoggerFilePath(null));
}
}
diff --git a/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java b/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java
index 6b3fd90ade7..cc36f2d7b6c 100644
--- a/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java
+++ b/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java
@@ -69,8 +69,8 @@ public void test_nameDoesNotContainKeywords_returnsFalse() {
assertFalse(predicate.test(new PersonBuilder().withName("Alice Bob").build()));
// Keywords match phone, email and address, but does not match name
- predicate = new NameContainsKeywordsPredicate(Arrays.asList("12345", "alice@email.com", "Main", "Street"));
- assertFalse(predicate.test(new PersonBuilder().withName("Alice").withPhone("12345")
+ predicate = new NameContainsKeywordsPredicate(Arrays.asList("87612345", "alice@email.com", "Main", "Street"));
+ assertFalse(predicate.test(new PersonBuilder().withName("Alice").withPhone("87612345")
.withEmail("alice@email.com").withAddress("Main Street").build()));
}
diff --git a/src/test/java/seedu/address/model/person/PersonTest.java b/src/test/java/seedu/address/model/person/PersonTest.java
index 31a10d156c9..8cfdef69fa3 100644
--- a/src/test/java/seedu/address/model/person/PersonTest.java
+++ b/src/test/java/seedu/address/model/person/PersonTest.java
@@ -6,6 +6,7 @@
import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_NRIC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;
import static seedu.address.testutil.Assert.assertThrows;
@@ -37,18 +38,18 @@ public void isSamePerson() {
.withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();
assertTrue(ALICE.isSamePerson(editedAlice));
- // different name, all other attributes same -> returns false
- editedAlice = new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();
+ // different NRIC, all other attributes same -> returns false
+ editedAlice = new PersonBuilder(ALICE).withNric(VALID_NRIC_BOB).build();
assertFalse(ALICE.isSamePerson(editedAlice));
// name differs in case, all other attributes same -> returns false
- Person editedBob = new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();
- assertFalse(BOB.isSamePerson(editedBob));
+ //Person editedBob = new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();
+ //assertFalse(BOB.isSamePerson(editedBob));
// name has trailing spaces, all other attributes same -> returns false
- String nameWithTrailingSpaces = VALID_NAME_BOB + " ";
- editedBob = new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();
- assertFalse(BOB.isSamePerson(editedBob));
+ //String nameWithTrailingSpaces = VALID_NAME_BOB + " ";
+ //editedBob = new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();
+ //assertFalse(BOB.isSamePerson(editedBob));
}
@Test
@@ -92,8 +93,9 @@ public void equals() {
@Test
public void toStringMethod() {
- String expected = Person.class.getCanonicalName() + "{name=" + ALICE.getName() + ", phone=" + ALICE.getPhone()
- + ", email=" + ALICE.getEmail() + ", address=" + ALICE.getAddress() + ", tags=" + ALICE.getTags() + "}";
+ String expected = Person.class.getCanonicalName() + "{name=" + ALICE.getName() + ", NRIC="
+ + ALICE.getNric() + ", phone=" + ALICE.getPhone() + ", email=" + ALICE.getEmail() + ", address="
+ + ALICE.getAddress() + ", tags=" + ALICE.getTags() + "}";
assertEquals(expected, ALICE.toString());
}
}
diff --git a/src/test/java/seedu/address/model/person/PhoneTest.java b/src/test/java/seedu/address/model/person/PhoneTest.java
index deaaa5ba190..0bcae628b31 100644
--- a/src/test/java/seedu/address/model/person/PhoneTest.java
+++ b/src/test/java/seedu/address/model/person/PhoneTest.java
@@ -33,17 +33,17 @@ public void isValidPhone() {
assertFalse(Phone.isValidPhone("9312 1534")); // spaces within digits
// valid phone numbers
- assertTrue(Phone.isValidPhone("911")); // exactly 3 numbers
+ assertTrue(Phone.isValidPhone("91122339")); // exactly 3 numbers
assertTrue(Phone.isValidPhone("93121534"));
- assertTrue(Phone.isValidPhone("124293842033123")); // long phone numbers
+ assertTrue(Phone.isValidPhone("82033123")); // long phone numbers
}
@Test
public void equals() {
- Phone phone = new Phone("999");
+ Phone phone = new Phone("99999999");
// same values -> returns true
- assertTrue(phone.equals(new Phone("999")));
+ assertTrue(phone.equals(new Phone("99999999")));
// same object -> returns true
assertTrue(phone.equals(phone));
@@ -55,6 +55,6 @@ public void equals() {
assertFalse(phone.equals(5.0f));
// different values -> returns false
- assertFalse(phone.equals(new Phone("995")));
+ assertFalse(phone.equals(new Phone("99999995")));
}
}
diff --git a/src/test/java/seedu/address/model/person/RemarkTest.java b/src/test/java/seedu/address/model/person/RemarkTest.java
new file mode 100644
index 00000000000..34117c68ddf
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/RemarkTest.java
@@ -0,0 +1,31 @@
+package seedu.address.model.person;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+public class RemarkTest {
+
+ @Test
+ public void equals() {
+ Remark remark = new Remark("Hello");
+
+ // same object -> returns true
+ assertTrue(remark.equals(remark));
+
+ // same values -> returns true
+ Remark remarkCopy = new Remark(remark.value);
+ assertTrue(remark.equals(remarkCopy));
+
+ // different types -> returns false
+ assertFalse(remark.equals(1));
+
+ // null -> returns false
+ assertFalse(remark.equals(null));
+
+ // different remark -> returns false
+ Remark differentRemark = new Remark("Bye");
+ assertFalse(remark.equals(differentRemark));
+ }
+}
diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
index 83b11331cdb..22848a8c6e2 100644
--- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
+++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
@@ -21,13 +21,16 @@ public class JsonAdaptedPersonTest {
private static final String INVALID_NAME = "R@chel";
private static final String INVALID_PHONE = "+651234";
private static final String INVALID_ADDRESS = " ";
+ private static final String INVALID_DATE = "2024/12/31";
private static final String INVALID_EMAIL = "example.com";
private static final String INVALID_TAG = "#friend";
private static final String VALID_NAME = BENSON.getName().toString();
+ private static final String VALID_NRIC = "S1234567A";
private static final String VALID_PHONE = BENSON.getPhone().toString();
private static final String VALID_EMAIL = BENSON.getEmail().toString();
private static final String VALID_ADDRESS = BENSON.getAddress().toString();
+ private static final String VALID_REMARK = BENSON.getRemark().toString();
private static final List VALID_TAGS = BENSON.getTags().stream()
.map(JsonAdaptedTag::new)
.collect(Collectors.toList());
@@ -41,14 +44,16 @@ public void toModelType_validPersonDetails_returnsPerson() throws Exception {
@Test
public void toModelType_invalidName_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(INVALID_NAME, VALID_NRIC, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS,
+ VALID_REMARK, VALID_TAGS);
String expectedMessage = Name.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullName_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_NRIC, VALID_PHONE, VALID_EMAIL,
+ VALID_ADDRESS, VALID_REMARK, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -56,14 +61,16 @@ public void toModelType_nullName_throwsIllegalValueException() {
@Test
public void toModelType_invalidPhone_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(VALID_NAME, VALID_NRIC, INVALID_PHONE, VALID_EMAIL,
+ VALID_ADDRESS, VALID_REMARK, VALID_TAGS);
String expectedMessage = Phone.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullPhone_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_NRIC, null, VALID_EMAIL,
+ VALID_ADDRESS, VALID_REMARK, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -71,14 +78,16 @@ public void toModelType_nullPhone_throwsIllegalValueException() {
@Test
public void toModelType_invalidEmail_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(VALID_NAME, VALID_NRIC, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS,
+ VALID_REMARK, VALID_TAGS);
String expectedMessage = Email.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullEmail_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_NRIC, VALID_PHONE, null,
+ VALID_ADDRESS, VALID_REMARK, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -86,14 +95,16 @@ public void toModelType_nullEmail_throwsIllegalValueException() {
@Test
public void toModelType_invalidAddress_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(VALID_NAME, VALID_NRIC, VALID_PHONE, VALID_EMAIL,
+ INVALID_ADDRESS, VALID_REMARK, VALID_TAGS);
String expectedMessage = Address.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullAddress_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_NRIC, VALID_PHONE, VALID_EMAIL,
+ null, VALID_REMARK, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -103,7 +114,8 @@ public void toModelType_invalidTags_throwsIllegalValueException() {
List invalidTags = new ArrayList<>(VALID_TAGS);
invalidTags.add(new JsonAdaptedTag(INVALID_TAG));
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);
+ new JsonAdaptedPerson(VALID_NAME, VALID_NRIC, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS,
+ VALID_REMARK, invalidTags);
assertThrows(IllegalValueException.class, person::toModelType);
}
diff --git a/src/test/java/seedu/address/storage/JsonAddressBookStorageTest.java b/src/test/java/seedu/address/storage/JsonAddressBookStorageTest.java
deleted file mode 100644
index 4e5ce9200c8..00000000000
--- a/src/test/java/seedu/address/storage/JsonAddressBookStorageTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package seedu.address.storage;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static seedu.address.testutil.Assert.assertThrows;
-import static seedu.address.testutil.TypicalPersons.ALICE;
-import static seedu.address.testutil.TypicalPersons.HOON;
-import static seedu.address.testutil.TypicalPersons.IDA;
-import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
-
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
-
-import seedu.address.commons.exceptions.DataLoadingException;
-import seedu.address.model.AddressBook;
-import seedu.address.model.ReadOnlyAddressBook;
-
-public class JsonAddressBookStorageTest {
- private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonAddressBookStorageTest");
-
- @TempDir
- public Path testFolder;
-
- @Test
- public void readAddressBook_nullFilePath_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> readAddressBook(null));
- }
-
- private java.util.Optional readAddressBook(String filePath) throws Exception {
- return new JsonAddressBookStorage(Paths.get(filePath)).readAddressBook(addToTestDataPathIfNotNull(filePath));
- }
-
- private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) {
- return prefsFileInTestDataFolder != null
- ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder)
- : null;
- }
-
- @Test
- public void read_missingFile_emptyResult() throws Exception {
- assertFalse(readAddressBook("NonExistentFile.json").isPresent());
- }
-
- @Test
- public void read_notJsonFormat_exceptionThrown() {
- assertThrows(DataLoadingException.class, () -> readAddressBook("notJsonFormatAddressBook.json"));
- }
-
- @Test
- public void readAddressBook_invalidPersonAddressBook_throwDataLoadingException() {
- assertThrows(DataLoadingException.class, () -> readAddressBook("invalidPersonAddressBook.json"));
- }
-
- @Test
- public void readAddressBook_invalidAndValidPersonAddressBook_throwDataLoadingException() {
- assertThrows(DataLoadingException.class, () -> readAddressBook("invalidAndValidPersonAddressBook.json"));
- }
-
- @Test
- public void readAndSaveAddressBook_allInOrder_success() throws Exception {
- Path filePath = testFolder.resolve("TempAddressBook.json");
- AddressBook original = getTypicalAddressBook();
- JsonAddressBookStorage jsonAddressBookStorage = new JsonAddressBookStorage(filePath);
-
- // Save in new file and read back
- jsonAddressBookStorage.saveAddressBook(original, filePath);
- ReadOnlyAddressBook readBack = jsonAddressBookStorage.readAddressBook(filePath).get();
- assertEquals(original, new AddressBook(readBack));
-
- // Modify data, overwrite exiting file, and read back
- original.addPerson(HOON);
- original.removePerson(ALICE);
- jsonAddressBookStorage.saveAddressBook(original, filePath);
- readBack = jsonAddressBookStorage.readAddressBook(filePath).get();
- assertEquals(original, new AddressBook(readBack));
-
- // Save and read without specifying file path
- original.addPerson(IDA);
- jsonAddressBookStorage.saveAddressBook(original); // file path not specified
- readBack = jsonAddressBookStorage.readAddressBook().get(); // file path not specified
- assertEquals(original, new AddressBook(readBack));
-
- }
-
- @Test
- public void saveAddressBook_nullAddressBook_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> saveAddressBook(null, "SomeFile.json"));
- }
-
- /**
- * Saves {@code addressBook} at the specified {@code filePath}.
- */
- private void saveAddressBook(ReadOnlyAddressBook addressBook, String filePath) {
- try {
- new JsonAddressBookStorage(Paths.get(filePath))
- .saveAddressBook(addressBook, addToTestDataPathIfNotNull(filePath));
- } catch (IOException ioe) {
- throw new AssertionError("There should not be an error writing to the file.", ioe);
- }
- }
-
- @Test
- public void saveAddressBook_nullFilePath_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> saveAddressBook(new AddressBook(), null));
- }
-}
diff --git a/src/test/java/seedu/address/storage/JsonMedLoggerStorageTest.java b/src/test/java/seedu/address/storage/JsonMedLoggerStorageTest.java
new file mode 100644
index 00000000000..5276f5c17c7
--- /dev/null
+++ b/src/test/java/seedu/address/storage/JsonMedLoggerStorageTest.java
@@ -0,0 +1,110 @@
+package seedu.address.storage;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static seedu.address.testutil.Assert.assertThrows;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.HOON;
+import static seedu.address.testutil.TypicalPersons.IDA;
+import static seedu.address.testutil.TypicalPersons.getTypicalMedLogger;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import seedu.address.commons.exceptions.DataLoadingException;
+import seedu.address.model.MedLogger;
+import seedu.address.model.ReadOnlyMedLogger;
+
+public class JsonMedLoggerStorageTest {
+ private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonMedLoggerStorageTest");
+
+ @TempDir
+ public Path testFolder;
+
+ @Test
+ public void readMedLogger_nullFilePath_throwsNullPointerException() {
+ assertThrows(NullPointerException.class, () -> readMedLogger(null));
+ }
+
+ private java.util.Optional readMedLogger(String filePath) throws Exception {
+ return new JsonMedLoggerStorage(Paths.get(filePath)).readMedLogger(addToTestDataPathIfNotNull(filePath));
+ }
+
+ private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) {
+ return prefsFileInTestDataFolder != null
+ ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder)
+ : null;
+ }
+
+ @Test
+ public void read_missingFile_emptyResult() throws Exception {
+ assertFalse(readMedLogger("NonExistentFile.json").isPresent());
+ }
+
+ @Test
+ public void read_notJsonFormat_exceptionThrown() {
+ assertThrows(DataLoadingException.class, () -> readMedLogger("notJsonFormatMedLogger.json"));
+ }
+
+ @Test
+ public void readMedLogger_invalidPersonMedLogger_throwDataLoadingException() {
+ assertThrows(DataLoadingException.class, () -> readMedLogger("invalidPersonMedLogger.json"));
+ }
+
+ @Test
+ public void readMedLogger_invalidAndValidPersonMedLogger_throwDataLoadingException() {
+ assertThrows(DataLoadingException.class, () -> readMedLogger("invalidAndValidPersonMedLogger.json"));
+ }
+
+ @Test
+ public void readAndSaveMedLogger_allInOrder_success() throws Exception {
+ Path filePath = testFolder.resolve("TempMedLogger.json");
+ MedLogger original = getTypicalMedLogger();
+ JsonMedLoggerStorage jsonMedLoggerStorage = new JsonMedLoggerStorage(filePath);
+
+ // Save in new file and read back
+ jsonMedLoggerStorage.saveMedLogger(original, filePath);
+ ReadOnlyMedLogger readBack = jsonMedLoggerStorage.readMedLogger(filePath).get();
+ assertEquals(original, new MedLogger(readBack));
+
+ // Modify data, overwrite exiting file, and read back
+ original.addPerson(HOON);
+ original.removePerson(ALICE);
+ jsonMedLoggerStorage.saveMedLogger(original, filePath);
+ readBack = jsonMedLoggerStorage.readMedLogger(filePath).get();
+ assertEquals(original, new MedLogger(readBack));
+
+ // Save and read without specifying file path
+ original.addPerson(IDA);
+ jsonMedLoggerStorage.saveMedLogger(original); // file path not specified
+ readBack = jsonMedLoggerStorage.readMedLogger().get(); // file path not specified
+ assertEquals(original, new MedLogger(readBack));
+
+ }
+
+ @Test
+ public void saveMedLogger_nullMedLogger_throwsNullPointerException() {
+ assertThrows(NullPointerException.class, () -> saveMedLogger(null, "SomeFile.json"));
+ }
+
+ /**
+ * Saves {@code medLogger} at the specified {@code filePath}.
+ */
+ private void saveMedLogger(ReadOnlyMedLogger medLogger, String filePath) {
+ try {
+ new JsonMedLoggerStorage(Paths.get(filePath))
+ .saveMedLogger(medLogger, addToTestDataPathIfNotNull(filePath));
+ } catch (IOException ioe) {
+ throw new AssertionError("There should not be an error writing to the file.", ioe);
+ }
+ }
+
+ @Test
+ public void saveMedLogger_nullFilePath_throwsNullPointerException() {
+ assertThrows(NullPointerException.class, () -> saveMedLogger(new MedLogger(), null));
+ }
+}
diff --git a/src/test/java/seedu/address/storage/JsonSerializableAddressBookTest.java b/src/test/java/seedu/address/storage/JsonSerializableMedLoggerTest.java
similarity index 53%
rename from src/test/java/seedu/address/storage/JsonSerializableAddressBookTest.java
rename to src/test/java/seedu/address/storage/JsonSerializableMedLoggerTest.java
index 188c9058d20..9b50c253e47 100644
--- a/src/test/java/seedu/address/storage/JsonSerializableAddressBookTest.java
+++ b/src/test/java/seedu/address/storage/JsonSerializableMedLoggerTest.java
@@ -10,37 +10,37 @@
import seedu.address.commons.exceptions.IllegalValueException;
import seedu.address.commons.util.JsonUtil;
-import seedu.address.model.AddressBook;
+import seedu.address.model.MedLogger;
import seedu.address.testutil.TypicalPersons;
-public class JsonSerializableAddressBookTest {
+public class JsonSerializableMedLoggerTest {
- private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonSerializableAddressBookTest");
- private static final Path TYPICAL_PERSONS_FILE = TEST_DATA_FOLDER.resolve("typicalPersonsAddressBook.json");
- private static final Path INVALID_PERSON_FILE = TEST_DATA_FOLDER.resolve("invalidPersonAddressBook.json");
- private static final Path DUPLICATE_PERSON_FILE = TEST_DATA_FOLDER.resolve("duplicatePersonAddressBook.json");
+ private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonSerializableMedLoggerTest");
+ private static final Path TYPICAL_PERSONS_FILE = TEST_DATA_FOLDER.resolve("typicalPersonsMedLogger.json");
+ private static final Path INVALID_PERSON_FILE = TEST_DATA_FOLDER.resolve("invalidPersonMedLogger.json");
+ private static final Path DUPLICATE_PERSON_FILE = TEST_DATA_FOLDER.resolve("duplicatePersonMedLogger.json");
@Test
public void toModelType_typicalPersonsFile_success() throws Exception {
- JsonSerializableAddressBook dataFromFile = JsonUtil.readJsonFile(TYPICAL_PERSONS_FILE,
- JsonSerializableAddressBook.class).get();
- AddressBook addressBookFromFile = dataFromFile.toModelType();
- AddressBook typicalPersonsAddressBook = TypicalPersons.getTypicalAddressBook();
- assertEquals(addressBookFromFile, typicalPersonsAddressBook);
+ JsonSerializableMedLogger dataFromFile = JsonUtil.readJsonFile(TYPICAL_PERSONS_FILE,
+ JsonSerializableMedLogger.class).get();
+ MedLogger medLoggerFromFile = dataFromFile.toModelType();
+ MedLogger typicalPersonsMedLogger = TypicalPersons.getTypicalMedLogger();
+ assertEquals(medLoggerFromFile, typicalPersonsMedLogger);
}
@Test
public void toModelType_invalidPersonFile_throwsIllegalValueException() throws Exception {
- JsonSerializableAddressBook dataFromFile = JsonUtil.readJsonFile(INVALID_PERSON_FILE,
- JsonSerializableAddressBook.class).get();
+ JsonSerializableMedLogger dataFromFile = JsonUtil.readJsonFile(INVALID_PERSON_FILE,
+ JsonSerializableMedLogger.class).get();
assertThrows(IllegalValueException.class, dataFromFile::toModelType);
}
@Test
public void toModelType_duplicatePersons_throwsIllegalValueException() throws Exception {
- JsonSerializableAddressBook dataFromFile = JsonUtil.readJsonFile(DUPLICATE_PERSON_FILE,
- JsonSerializableAddressBook.class).get();
- assertThrows(IllegalValueException.class, JsonSerializableAddressBook.MESSAGE_DUPLICATE_PERSON,
+ JsonSerializableMedLogger dataFromFile = JsonUtil.readJsonFile(DUPLICATE_PERSON_FILE,
+ JsonSerializableMedLogger.class).get();
+ assertThrows(IllegalValueException.class, JsonSerializableMedLogger.MESSAGE_DUPLICATE_PERSON,
dataFromFile::toModelType);
}
diff --git a/src/test/java/seedu/address/storage/JsonUserPrefsStorageTest.java b/src/test/java/seedu/address/storage/JsonUserPrefsStorageTest.java
index ed0a413526a..8811243e036 100644
--- a/src/test/java/seedu/address/storage/JsonUserPrefsStorageTest.java
+++ b/src/test/java/seedu/address/storage/JsonUserPrefsStorageTest.java
@@ -73,7 +73,7 @@ public void readUserPrefs_extraValuesInFile_extraValuesIgnored() throws DataLoad
private UserPrefs getTypicalUserPrefs() {
UserPrefs userPrefs = new UserPrefs();
userPrefs.setGuiSettings(new GuiSettings(1000, 500, 300, 100));
- userPrefs.setAddressBookFilePath(Paths.get("addressbook.json"));
+ userPrefs.setMedLoggerFilePath(Paths.get("medlogger.json"));
return userPrefs;
}
diff --git a/src/test/java/seedu/address/storage/StorageManagerTest.java b/src/test/java/seedu/address/storage/StorageManagerTest.java
index 99a16548970..a0c2a656a65 100644
--- a/src/test/java/seedu/address/storage/StorageManagerTest.java
+++ b/src/test/java/seedu/address/storage/StorageManagerTest.java
@@ -2,7 +2,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.TypicalPersons.getTypicalMedLogger;
import java.nio.file.Path;
@@ -11,8 +11,8 @@
import org.junit.jupiter.api.io.TempDir;
import seedu.address.commons.core.GuiSettings;
-import seedu.address.model.AddressBook;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.MedLogger;
+import seedu.address.model.ReadOnlyMedLogger;
import seedu.address.model.UserPrefs;
public class StorageManagerTest {
@@ -24,9 +24,9 @@ public class StorageManagerTest {
@BeforeEach
public void setUp() {
- JsonAddressBookStorage addressBookStorage = new JsonAddressBookStorage(getTempFilePath("ab"));
+ JsonMedLoggerStorage medLoggerStorage = new JsonMedLoggerStorage(getTempFilePath("ab"));
JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(getTempFilePath("prefs"));
- storageManager = new StorageManager(addressBookStorage, userPrefsStorage);
+ storageManager = new StorageManager(medLoggerStorage, userPrefsStorage);
}
private Path getTempFilePath(String fileName) {
@@ -48,21 +48,21 @@ public void prefsReadSave() throws Exception {
}
@Test
- public void addressBookReadSave() throws Exception {
+ public void medLoggerReadSave() throws Exception {
/*
* Note: This is an integration test that verifies the StorageManager is properly wired to the
- * {@link JsonAddressBookStorage} class.
- * More extensive testing of UserPref saving/reading is done in {@link JsonAddressBookStorageTest} class.
+ * {@link JsonMedLoggerStorage} class.
+ * More extensive testing of UserPref saving/reading is done in {@link JsonMedLoggerStorageTest} class.
*/
- AddressBook original = getTypicalAddressBook();
- storageManager.saveAddressBook(original);
- ReadOnlyAddressBook retrieved = storageManager.readAddressBook().get();
- assertEquals(original, new AddressBook(retrieved));
+ MedLogger original = getTypicalMedLogger();
+ storageManager.saveMedLogger(original);
+ ReadOnlyMedLogger retrieved = storageManager.readMedLogger().get();
+ assertEquals(original, new MedLogger(retrieved));
}
@Test
- public void getAddressBookFilePath() {
- assertNotNull(storageManager.getAddressBookFilePath());
+ public void getMedLoggerFilePath() {
+ assertNotNull(storageManager.getMedLoggerFilePath());
}
}
diff --git a/src/test/java/seedu/address/testutil/AddressBookBuilder.java b/src/test/java/seedu/address/testutil/AddressBookBuilder.java
deleted file mode 100644
index d53799fd110..00000000000
--- a/src/test/java/seedu/address/testutil/AddressBookBuilder.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package seedu.address.testutil;
-
-import seedu.address.model.AddressBook;
-import seedu.address.model.person.Person;
-
-/**
- * A utility class to help with building Addressbook objects.
- * Example usage:
- * {@code AddressBook ab = new AddressBookBuilder().withPerson("John", "Doe").build();}
- */
-public class AddressBookBuilder {
-
- private AddressBook addressBook;
-
- public AddressBookBuilder() {
- addressBook = new AddressBook();
- }
-
- public AddressBookBuilder(AddressBook addressBook) {
- this.addressBook = addressBook;
- }
-
- /**
- * Adds a new {@code Person} to the {@code AddressBook} that we are building.
- */
- public AddressBookBuilder withPerson(Person person) {
- addressBook.addPerson(person);
- return this;
- }
-
- public AddressBook build() {
- return addressBook;
- }
-}
diff --git a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
index 4584bd5044e..93791d32e56 100644
--- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
+++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
@@ -4,10 +4,11 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
+import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.tag.Tag;
@@ -33,6 +34,7 @@ public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {
public EditPersonDescriptorBuilder(Person person) {
descriptor = new EditPersonDescriptor();
descriptor.setName(person.getName());
+ descriptor.setNric(person.getNric());
descriptor.setPhone(person.getPhone());
descriptor.setEmail(person.getEmail());
descriptor.setAddress(person.getAddress());
@@ -47,6 +49,14 @@ public EditPersonDescriptorBuilder withName(String name) {
return this;
}
+ /**
+ * Sets the {@code Nric} of the {@code EditPersonDescriptor} that we are building.
+ */
+ public EditPersonDescriptorBuilder withNric(String value) {
+ descriptor.setNric(new Nric(value));
+ return this;
+ }
+
/**
* Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.
*/
diff --git a/src/test/java/seedu/address/testutil/MedLoggerBuilder.java b/src/test/java/seedu/address/testutil/MedLoggerBuilder.java
new file mode 100644
index 00000000000..e875385e352
--- /dev/null
+++ b/src/test/java/seedu/address/testutil/MedLoggerBuilder.java
@@ -0,0 +1,34 @@
+package seedu.address.testutil;
+
+import seedu.address.model.MedLogger;
+import seedu.address.model.person.Person;
+
+/**
+ * A utility class to help with building Addressbook objects.
+ * Example usage:
+ * {@code MedLogger ab = new MedLoggerBuilder().withPerson("John", "Doe").build();}
+ */
+public class MedLoggerBuilder {
+
+ private MedLogger medLogger;
+
+ public MedLoggerBuilder() {
+ medLogger = new MedLogger();
+ }
+
+ public MedLoggerBuilder(MedLogger medLogger) {
+ this.medLogger = medLogger;
+ }
+
+ /**
+ * Adds a new {@code Person} to the {@code MedLogger} that we are building.
+ */
+ public MedLoggerBuilder withPerson(Person person) {
+ medLogger.addPerson(person);
+ return this;
+ }
+
+ public MedLogger build() {
+ return medLogger;
+ }
+}
diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java
index 6be381d39ba..ffc08ba8904 100644
--- a/src/test/java/seedu/address/testutil/PersonBuilder.java
+++ b/src/test/java/seedu/address/testutil/PersonBuilder.java
@@ -4,10 +4,13 @@
import java.util.Set;
import seedu.address.model.person.Address;
+import seedu.address.model.person.DateTime;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
+import seedu.address.model.person.Nric;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
import seedu.address.model.util.SampleDataUtil;
@@ -17,14 +20,19 @@
public class PersonBuilder {
public static final String DEFAULT_NAME = "Amy Bee";
+ public static final String DEFAULT_NRIC = "S1234777A";
public static final String DEFAULT_PHONE = "85355255";
public static final String DEFAULT_EMAIL = "amy@gmail.com";
public static final String DEFAULT_ADDRESS = "123, Jurong West Ave 6, #08-111";
+ public static final String DEFAULT_REMARK = "She likes aardvarks.";
private Name name;
+ private Nric nric;
private Phone phone;
private Email email;
private Address address;
+ private DateTime dateTime;
+ private Remark remark;
private Set tags;
/**
@@ -32,9 +40,11 @@ public class PersonBuilder {
*/
public PersonBuilder() {
name = new Name(DEFAULT_NAME);
+ nric = new Nric(DEFAULT_NRIC);
phone = new Phone(DEFAULT_PHONE);
email = new Email(DEFAULT_EMAIL);
address = new Address(DEFAULT_ADDRESS);
+ remark = new Remark(DEFAULT_REMARK);
tags = new HashSet<>();
}
@@ -43,9 +53,11 @@ public PersonBuilder() {
*/
public PersonBuilder(Person personToCopy) {
name = personToCopy.getName();
+ nric = personToCopy.getNric();
phone = personToCopy.getPhone();
email = personToCopy.getEmail();
address = personToCopy.getAddress();
+ remark = personToCopy.getRemark();
tags = new HashSet<>(personToCopy.getTags());
}
@@ -57,10 +69,18 @@ public PersonBuilder withName(String name) {
return this;
}
+ /**
+ * Sets the {@code Name} of the {@code Person} that we are building.
+ */
+ public PersonBuilder withNric(String value) {
+ this.nric = new Nric(value);
+ return this;
+ }
+
/**
* Parses the {@code tags} into a {@code Set} and set it to the {@code Person} that we are building.
*/
- public PersonBuilder withTags(String ... tags) {
+ public PersonBuilder withTags(String... tags) {
this.tags = SampleDataUtil.getTagSet(tags);
return this;
}
@@ -89,8 +109,16 @@ public PersonBuilder withEmail(String email) {
return this;
}
+ /**
+ * Sets the {@code Remark} of the {@code Person} that we are building.
+ */
+ public PersonBuilder withRemark(String remark) {
+ this.remark = new Remark(remark);
+ return this;
+ }
+
public Person build() {
- return new Person(name, phone, email, address, tags);
+ return new Person(name, nric, phone, email, address, remark, tags);
}
}
diff --git a/src/test/java/seedu/address/testutil/PersonUtil.java b/src/test/java/seedu/address/testutil/PersonUtil.java
index 90849945183..fbac1a45aeb 100644
--- a/src/test/java/seedu/address/testutil/PersonUtil.java
+++ b/src/test/java/seedu/address/testutil/PersonUtil.java
@@ -3,13 +3,14 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import java.util.Set;
-import seedu.address.logic.commands.AddCommand;
-import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
+import seedu.address.logic.commands.AddPersonCommand;
+import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;
import seedu.address.model.person.Person;
import seedu.address.model.tag.Tag;
@@ -22,7 +23,7 @@ public class PersonUtil {
* Returns an add command string for adding the {@code person}.
*/
public static String getAddCommand(Person person) {
- return AddCommand.COMMAND_WORD + " " + getPersonDetails(person);
+ return AddPersonCommand.COMMAND_WORD + " " + getPersonDetails(person);
}
/**
@@ -31,6 +32,7 @@ public static String getAddCommand(Person person) {
public static String getPersonDetails(Person person) {
StringBuilder sb = new StringBuilder();
sb.append(PREFIX_NAME + person.getName().fullName + " ");
+ sb.append(PREFIX_NRIC + person.getNric().value + " ");
sb.append(PREFIX_PHONE + person.getPhone().value + " ");
sb.append(PREFIX_EMAIL + person.getEmail().value + " ");
sb.append(PREFIX_ADDRESS + person.getAddress().value + " ");
@@ -46,6 +48,7 @@ public static String getPersonDetails(Person person) {
public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {
StringBuilder sb = new StringBuilder();
descriptor.getName().ifPresent(name -> sb.append(PREFIX_NAME).append(name.fullName).append(" "));
+ descriptor.getNric().ifPresent(nric -> sb.append(PREFIX_NRIC).append(nric.value).append(" "));
descriptor.getPhone().ifPresent(phone -> sb.append(PREFIX_PHONE).append(phone.value).append(" "));
descriptor.getEmail().ifPresent(email -> sb.append(PREFIX_EMAIL).append(email.value).append(" "));
descriptor.getAddress().ifPresent(address -> sb.append(PREFIX_ADDRESS).append(address.value).append(" "));
diff --git a/src/test/java/seedu/address/testutil/TypicalPersons.java b/src/test/java/seedu/address/testutil/TypicalPersons.java
index fec76fb7129..cfbfd34ca29 100644
--- a/src/test/java/seedu/address/testutil/TypicalPersons.java
+++ b/src/test/java/seedu/address/testutil/TypicalPersons.java
@@ -15,7 +15,7 @@
import java.util.Arrays;
import java.util.List;
-import seedu.address.model.AddressBook;
+import seedu.address.model.MedLogger;
import seedu.address.model.person.Person;
/**
@@ -24,46 +24,52 @@
public class TypicalPersons {
public static final Person ALICE = new PersonBuilder().withName("Alice Pauline")
+ .withNric("S1234567A")
.withAddress("123, Jurong West Ave 6, #08-111").withEmail("alice@example.com")
- .withPhone("94351253")
+ .withPhone("88888888")
+ .withRemark("She likes aardvarks.")
.withTags("friends").build();
public static final Person BENSON = new PersonBuilder().withName("Benson Meier")
+ .withNric("S1234567B")
.withAddress("311, Clementi Ave 2, #02-25")
- .withEmail("johnd@example.com").withPhone("98765432")
+ .withEmail("johnd@example.com").withPhone("99999999")
+ .withRemark("She likes aardvarks.")
.withTags("owesMoney", "friends").build();
public static final Person CARL = new PersonBuilder().withName("Carl Kurz").withPhone("95352563")
- .withEmail("heinz@example.com").withAddress("wall street").build();
+ .withNric("S1234567C").withEmail("heinz@example.com").withAddress("wall street").build();
public static final Person DANIEL = new PersonBuilder().withName("Daniel Meier").withPhone("87652533")
- .withEmail("cornelia@example.com").withAddress("10th street").withTags("friends").build();
- public static final Person ELLE = new PersonBuilder().withName("Elle Meyer").withPhone("9482224")
- .withEmail("werner@example.com").withAddress("michegan ave").build();
- public static final Person FIONA = new PersonBuilder().withName("Fiona Kunz").withPhone("9482427")
- .withEmail("lydia@example.com").withAddress("little tokyo").build();
- public static final Person GEORGE = new PersonBuilder().withName("George Best").withPhone("9482442")
- .withEmail("anna@example.com").withAddress("4th street").build();
+ .withEmail("cornelia@example.com").withAddress("10th street")
+ .withNric("S1234567D").withTags("friends").build();
+ public static final Person ELLE = new PersonBuilder().withName("Elle Meyer").withPhone("94822224")
+ .withNric("S1234567E").withEmail("werner@example.com").withAddress("michegan ave").build();
+ public static final Person FIONA = new PersonBuilder().withName("Fiona Kunz").withPhone("94822427")
+ .withNric("S1234567F").withEmail("lydia@example.com").withAddress("little tokyo").build();
+ public static final Person GEORGE = new PersonBuilder().withName("George Best").withPhone("94822442")
+ .withNric("S1234567G").withEmail("anna@example.com").withAddress("4th street").build();
// Manually added
- public static final Person HOON = new PersonBuilder().withName("Hoon Meier").withPhone("8482424")
- .withEmail("stefan@example.com").withAddress("little india").build();
- public static final Person IDA = new PersonBuilder().withName("Ida Mueller").withPhone("8482131")
- .withEmail("hans@example.com").withAddress("chicago ave").build();
+ public static final Person HOON = new PersonBuilder().withName("Hoon Meier").withPhone("84822424")
+ .withNric("S1234567H").withEmail("stefan@example.com").withAddress("little india").build();
+ public static final Person IDA = new PersonBuilder().withName("Ida Mueller").withPhone("84822131")
+ .withNric("S1234567I").withEmail("hans@example.com").withAddress("chicago ave").build();
// Manually added - Person's details found in {@code CommandTestUtil}
public static final Person AMY = new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)
- .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();
+ .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND)
+ .withNric("S1234566A").build();
public static final Person BOB = new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)
.withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)
- .build();
+ .withNric("S1234566B").build();
public static final String KEYWORD_MATCHING_MEIER = "Meier"; // A keyword that matches MEIER
private TypicalPersons() {} // prevents instantiation
/**
- * Returns an {@code AddressBook} with all the typical persons.
+ * Returns an {@code MedLogger} with all the typical persons.
*/
- public static AddressBook getTypicalAddressBook() {
- AddressBook ab = new AddressBook();
+ public static MedLogger getTypicalMedLogger() {
+ MedLogger ab = new MedLogger();
for (Person person : getTypicalPersons()) {
ab.addPerson(person);
}