diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 555365d3f368..123e36ed7dbb 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -2,8 +2,12 @@ import static java.util.Objects.requireNonNull; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_BIKE; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANRATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANTIME; 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; @@ -22,15 +26,23 @@ public class AddCommand extends Command { public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a loan to the loan book. " + "Parameters: " + PREFIX_NAME + "NAME " + + PREFIX_NRIC + "NRIC " + PREFIX_PHONE + "PHONE " + PREFIX_EMAIL + "EMAIL " + PREFIX_ADDRESS + "ADDRESS " + + PREFIX_BIKE + "BIKE " + + PREFIX_LOANRATE + "LOANRATE " + + PREFIX_LOANTIME + "LOANTIME " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John Doe " + + PREFIX_NRIC + "T0248272F " + PREFIX_PHONE + "98765432 " + PREFIX_EMAIL + "johnd@example.com " + PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 " + + PREFIX_BIKE + "Bike001 " + + PREFIX_LOANRATE + "3.5 " + + PREFIX_LOANTIME + "2018-10-01 12:00 " + PREFIX_TAG + "friends " + PREFIX_TAG + "owesMoney"; diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 619dc869a485..8a1633fdbf1a 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -2,8 +2,12 @@ import static java.util.Objects.requireNonNull; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_BIKE; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANRATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANTIME; 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_LOANS; @@ -20,10 +24,14 @@ import seedu.address.logic.CommandHistory; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; @@ -39,9 +47,13 @@ public class EditCommand extends Command { + "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] " + + "[" + PREFIX_BIKE + "BIKE] " + + "[" + PREFIX_LOANRATE + "LOANRATE] " + + "[" + PREFIX_LOANTIME + "LOANTIME] " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " 1 " + PREFIX_PHONE + "91234567 " @@ -96,12 +108,24 @@ private static Loan createEditedLoan(Loan loanToEdit, EditLoanDescriptor editLoa assert loanToEdit != null; Name updatedName = editLoanDescriptor.getName().orElse(loanToEdit.getName()); + Nric updatedNric = editLoanDescriptor.getNric().orElse(loanToEdit.getNric()); Phone updatedPhone = editLoanDescriptor.getPhone().orElse(loanToEdit.getPhone()); Email updatedEmail = editLoanDescriptor.getEmail().orElse(loanToEdit.getEmail()); Address updatedAddress = editLoanDescriptor.getAddress().orElse(loanToEdit.getAddress()); + Bike updatedBike = editLoanDescriptor.getBike().orElse(loanToEdit.getBike()); + LoanRate updatedRate = editLoanDescriptor.getLoanRate().orElse(loanToEdit.getLoanRate()); + LoanTime updatedTime = editLoanDescriptor.getLoanTime().orElse(loanToEdit.getLoanTime()); Set updatedTags = editLoanDescriptor.getTags().orElse(loanToEdit.getTags()); - return new Loan(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags); + return new Loan(updatedName, + updatedNric, + updatedPhone, + updatedEmail, + updatedAddress, + updatedBike, + updatedRate, + updatedTime, + updatedTags); } @Override @@ -128,9 +152,13 @@ public boolean equals(Object other) { */ public static class EditLoanDescriptor { private Name name; + private Nric nric; private Phone phone; private Email email; private Address address; + private Bike bike; + private LoanRate rate; + private LoanTime time; private Set tags; public EditLoanDescriptor() {} @@ -141,9 +169,13 @@ public EditLoanDescriptor() {} */ public EditLoanDescriptor(EditLoanDescriptor toCopy) { setName(toCopy.name); + setNric(toCopy.nric); setPhone(toCopy.phone); setEmail(toCopy.email); setAddress(toCopy.address); + setBike(toCopy.bike); + setLoanRate(toCopy.rate); + setLoanTime(toCopy.time); setTags(toCopy.tags); } @@ -162,6 +194,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; } @@ -186,6 +226,30 @@ public Optional
getAddress() { return Optional.ofNullable(address); } + public void setBike(Bike bike) { + this.bike = bike; + } + + public Optional getBike() { + return Optional.ofNullable(bike); + } + + public void setLoanRate(LoanRate rate) { + this.rate = rate; + } + + public Optional getLoanRate() { + return Optional.ofNullable(rate); + } + + public void setLoanTime(LoanTime time) { + this.time = time; + } + + public Optional getLoanTime() { + return Optional.ofNullable(time); + } + /** * Sets {@code tags} to this object's {@code tags}. * A defensive copy of {@code tags} is used internally. @@ -219,9 +283,13 @@ public boolean equals(Object other) { EditLoanDescriptor e = (EditLoanDescriptor) other; return getName().equals(e.getName()) + && getNric().equals(e.getNric()) && getPhone().equals(e.getPhone()) && getEmail().equals(e.getEmail()) && getAddress().equals(e.getAddress()) + && getBike().equals(e.getBike()) + && getLoanRate().equals(e.getLoanRate()) + && getLoanTime().equals(e.getLoanTime()) && getTags().equals(e.getTags()); } } diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index 7f14a302805f..846928a347f5 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -2,8 +2,12 @@ import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_BIKE; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANRATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANTIME; 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; @@ -12,10 +16,14 @@ import seedu.address.logic.commands.AddCommand; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; @@ -31,20 +39,41 @@ public class AddCommandParser implements Parser { */ public AddCommand 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_BIKE, + PREFIX_LOANRATE, + PREFIX_LOANTIME, + PREFIX_TAG); - if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) + if (!arePrefixesPresent(argMultimap, + PREFIX_NAME, + PREFIX_NRIC, + PREFIX_PHONE, + PREFIX_EMAIL, + PREFIX_ADDRESS, + PREFIX_BIKE, + PREFIX_LOANRATE, + PREFIX_LOANTIME) || !argMultimap.getPreamble().isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } 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()); + Bike bike = ParserUtil.parseBike(argMultimap.getValue(PREFIX_BIKE).get()); + LoanRate rate = ParserUtil.parseLoanRate(argMultimap.getValue(PREFIX_LOANRATE).get()); + LoanTime time = ParserUtil.parseLoanTime(argMultimap.getValue(PREFIX_LOANTIME).get()); Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG)); - Loan loan = new Loan(name, phone, email, address, tagList); + Loan loan = new Loan(name, nric, phone, email, address, bike, rate, time, tagList); return new AddCommand(loan); } diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java index 4d82a9b3e48f..44eb56c24e63 100644 --- a/src/main/java/seedu/address/logic/parser/CliSyntax.java +++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java @@ -7,11 +7,15 @@ public class CliSyntax { /* Prefix definitions */ public static final Prefix PREFIX_NAME = new Prefix("n/"); + public static final Prefix PREFIX_NRIC = new Prefix("ic/"); public static final Prefix PREFIX_INDEX = new Prefix("i/"); public static final Prefix PREFIX_PASSWORD = new Prefix("x/"); 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_BIKE = new Prefix("b/"); + public static final Prefix PREFIX_LOANRATE = new Prefix("lr/"); + public static final Prefix PREFIX_LOANTIME = new Prefix("lt/"); public static final Prefix PREFIX_TAG = new Prefix("t/"); } diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index ce65bcbb3488..8532454939ed 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -3,8 +3,12 @@ import static java.util.Objects.requireNonNull; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_BIKE; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANRATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANTIME; 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; @@ -32,7 +36,8 @@ public class EditCommandParser implements Parser { public EditCommand parse(String args) throws ParseException { requireNonNull(args); 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_BIKE, PREFIX_LOANRATE, PREFIX_LOANTIME, PREFIX_TAG); Index index; @@ -46,6 +51,9 @@ public EditCommand parse(String args) throws ParseException { if (argMultimap.getValue(PREFIX_NAME).isPresent()) { editLoanDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get())); } + if (argMultimap.getValue(PREFIX_NRIC).isPresent()) { + editLoanDescriptor.setNric(ParserUtil.parseNric(argMultimap.getValue(PREFIX_NRIC).get())); + } if (argMultimap.getValue(PREFIX_PHONE).isPresent()) { editLoanDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get())); } @@ -55,6 +63,15 @@ public EditCommand parse(String args) throws ParseException { if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { editLoanDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get())); } + if (argMultimap.getValue(PREFIX_BIKE).isPresent()) { + editLoanDescriptor.setBike(ParserUtil.parseBike(argMultimap.getValue(PREFIX_BIKE).get())); + } + if (argMultimap.getValue(PREFIX_LOANRATE).isPresent()) { + editLoanDescriptor.setLoanRate(ParserUtil.parseLoanRate(argMultimap.getValue(PREFIX_LOANRATE).get())); + } + if (argMultimap.getValue(PREFIX_LOANTIME).isPresent()) { + editLoanDescriptor.setLoanTime(ParserUtil.parseLoanTime(argMultimap.getValue(PREFIX_LOANTIME).get())); + } parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editLoanDescriptor::setTags); if (!editLoanDescriptor.isAnyFieldEdited()) { diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index b7e4afc260b3..1619f8350444 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -10,9 +10,13 @@ import seedu.address.commons.util.StringUtil; import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.Password; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; @@ -51,6 +55,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 trimmedNric = nric.trim(); + if (!Name.isValidName(trimmedNric)) { + throw new ParseException(Nric.MESSAGE_NRIC_CONSTRAINTS); + } + return new Nric(trimmedNric); + } + /** * Parses a {@code String phone} into a {@code Phone}. * Leading and trailing whitespaces will be trimmed. @@ -111,6 +130,51 @@ public static Email parseEmail(String email) throws ParseException { return new Email(trimmedEmail); } + /** + * Parses a {@code String bike} into a {@code Bike}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws ParseException if the given {@code bike} is invalid. + */ + public static Bike parseBike(String bike) throws ParseException { + requireNonNull(bike); + String trimmedBike = bike.trim(); + if (!Name.isValidName(trimmedBike)) { + throw new ParseException(Name.MESSAGE_NAME_CONSTRAINTS); + } + return new Bike(new Name(trimmedBike)); + } + + /** + * Parses a {@code String rate} into a {@code LoanRate}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws ParseException if the given {@code rate} is invalid. + */ + public static LoanRate parseLoanRate(String rate) throws ParseException { + requireNonNull(rate); + String trimmedLoanRate = rate.trim(); + if (!LoanRate.isValidRate(trimmedLoanRate)) { + throw new ParseException(LoanRate.MESSAGE_LOANRATE_CONSTRAINTS); + } + return new LoanRate(trimmedLoanRate); + } + + /** + * Parses a {@code String time} into a {@code LoanTime}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws ParseException if the given {@code time} is invalid. + */ + public static LoanTime parseLoanTime(String time) throws ParseException { + requireNonNull(time); + String trimmedLoanTime = time.trim(); + if (!LoanTime.isValidLoanTime(trimmedLoanTime)) { + throw new ParseException(LoanTime.MESSAGE_LOANTIME_CONSTRAINTS); + } + return new LoanTime(trimmedLoanTime); + } + /** * Parses a {@code String tag} into a {@code Tag}. * Leading and trailing whitespaces will be trimmed. diff --git a/src/main/java/seedu/address/model/loan/Loan.java b/src/main/java/seedu/address/model/loan/Loan.java index db7f9a1b07e9..02b6d38e79bc 100644 --- a/src/main/java/seedu/address/model/loan/Loan.java +++ b/src/main/java/seedu/address/model/loan/Loan.java @@ -7,6 +7,7 @@ import java.util.Objects; import java.util.Set; +import seedu.address.model.bike.Bike; import seedu.address.model.tag.Tag; /** @@ -16,23 +17,41 @@ public class Loan { // Identity fields + private final Bike bike; private final Name name; - private final Phone phone; - private final Email email; + private final Nric nric; + //TODO: add LoanId filed + //private final LoanId id; // Data fields + private final LoanRate rate; + private final LoanTime time; + private final Phone phone; + private final Email email; private final Address address; private final Set tags = new HashSet<>(); /** * Every field must be present and not null. */ - public Loan(Name name, Phone phone, Email email, Address address, Set tags) { - requireAllNonNull(name, phone, email, address, tags); + public Loan(Name name, + Nric nric, + Phone phone, + Email email, + Address address, + Bike bike, + LoanRate rate, + LoanTime time, + Set tags) { + requireAllNonNull(name, nric, phone, email, address, bike, rate, time, tags); this.name = name; + this.nric = nric; this.phone = phone; this.email = email; this.address = address; + this.bike = bike; + this.rate = rate; + this.time = time; this.tags.addAll(tags); } @@ -52,6 +71,22 @@ public Address getAddress() { return address; } + public Nric getNric() { + return nric; + } + + public Bike getBike() { + return bike; + } + + public LoanRate getLoanRate() { + return rate; + } + + public LoanTime getLoanTime() { + return time; + } + /** * Returns an immutable tag set, which throws {@code UnsupportedOperationException} * if modification is attempted. @@ -71,7 +106,10 @@ public boolean isSameLoan(Loan otherLoan) { return otherLoan != null && otherLoan.getName().equals(getName()) - && (otherLoan.getPhone().equals(getPhone()) || otherLoan.getEmail().equals(getEmail())); + && otherLoan.getNric().equals(getNric()) + && otherLoan.getBike().equals(getBike()) + && (otherLoan.getEmail().equals(getEmail()) || otherLoan.getPhone().equals(getPhone()) + || otherLoan.getLoanRate().equals(getLoanRate()) || otherLoan.getLoanTime().equals(getLoanTime())); } /** @@ -90,28 +128,40 @@ public boolean equals(Object other) { Loan otherLoan = (Loan) other; return otherLoan.getName().equals(getName()) + && otherLoan.getNric().equals(getNric()) && otherLoan.getPhone().equals(getPhone()) && otherLoan.getEmail().equals(getEmail()) && otherLoan.getAddress().equals(getAddress()) + && otherLoan.getBike().equals(getBike()) + && otherLoan.getLoanRate().equals(getLoanRate()) + && otherLoan.getLoanTime().equals(getLoanTime()) && otherLoan.getTags().equals(getTags()); } @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, bike, rate, time, tags); } @Override public String toString() { final StringBuilder builder = new StringBuilder(); builder.append(getName()) + .append(" Nric: ") + .append(getNric()) .append(" Phone: ") .append(getPhone()) .append(" Email: ") .append(getEmail()) .append(" Address: ") .append(getAddress()) + .append(" Bike: ") + .append(getBike()) + .append(" LoanRate: ") + .append(getLoanRate()) + .append(" LoanTime: ") + .append(getLoanTime()) .append(" Tags: "); getTags().forEach(builder::append); return builder.toString(); diff --git a/src/main/java/seedu/address/model/loan/LoanRate.java b/src/main/java/seedu/address/model/loan/LoanRate.java index 53fbfddb3068..e107ecda6942 100644 --- a/src/main/java/seedu/address/model/loan/LoanRate.java +++ b/src/main/java/seedu/address/model/loan/LoanRate.java @@ -14,7 +14,7 @@ public class LoanRate extends DataField { * * @param rate A valid rate. */ - LoanRate(String rate) { + public LoanRate(String rate) { super(MESSAGE_LOANRATE_CONSTRAINTS, LoanRate::isValidRate, Double::parseDouble, rate); } diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index d69d1e55aa1b..afc2ea88b877 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -6,10 +6,14 @@ import seedu.address.model.LoanBook; import seedu.address.model.ReadOnlyLoanBook; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; @@ -19,24 +23,30 @@ public class SampleDataUtil { public static Loan[] getSampleLoans() { return new Loan[] { - new Loan(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"), - new Address("Blk 30 Geylang Street 29, #06-40"), - getTagSet("friends")), - new Loan(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 Loan(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"), - new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), - getTagSet("neighbours")), - new Loan(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 Loan(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"), - new Address("Blk 47 Tampines Street 20, #17-35"), - getTagSet("classmates")), - new Loan(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"), - new Address("Blk 45 Aljunied Street 85, #11-31"), - getTagSet("colleagues")) + new Loan(new Name("Alex Yeoh"), new Nric("S9013904E"), new Phone("87438807"), + new Email("alexyeoh@example.com"), new Address("Blk 30 Geylang Street 29, #06-40"), + new Bike(new Name("Bike001")), new LoanRate("12.9"), new LoanTime("2010-12-25 04:09"), + getTagSet("friends")), + new Loan(new Name("Bernice Yu"), new Nric("T0213176A"), new Phone("99272758"), + new Email("berniceyu@example.com"), new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), + new Bike(new Name("Bike002")), new LoanRate("1.95"), new LoanTime("2010-12-25 14:09"), + getTagSet("colleagues", "friends")), + new Loan(new Name("Charlotte Oliveiro"), new Nric("F9576390K"), new Phone("93210283"), + new Email("charlotte@example.com"), new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), + new Bike(new Name("Silver Surfer")), new LoanRate("3.90"), new LoanTime("04:55"), + getTagSet("neighbours")), + new Loan(new Name("David Li"), new Nric("G0846554T"), new Phone("91031282"), + new Email("lidavid@example.com"), new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), + new Bike(new Name("Blue Ocean")), new LoanRate("33"), new LoanTime("12:21"), + getTagSet("family")), + new Loan(new Name("Irfan Ibrahim"), new Nric("S8830104H"), new Phone("92492021"), + new Email("irfan@example.com"), new Address("Blk 47 Tampines Street 20, #17-35"), + new Bike(new Name("Bike013")), new LoanRate("6.7"), new LoanTime("2018-01-30 15:10"), + getTagSet("classmates")), + new Loan(new Name("Roy Balakrishnan"), new Nric("S7588900C"), new Phone("92624417"), + new Email("royb@example.com"), new Address("Blk 45 Aljunied Street 85, #11-31"), + new Bike(new Name("Bike099")), new LoanRate("3.95"), new LoanTime("2018-10-20 20:10"), + getTagSet("colleagues")) }; } diff --git a/src/main/java/seedu/address/storage/XmlAdaptedLoan.java b/src/main/java/seedu/address/storage/XmlAdaptedLoan.java index 85e1659e7565..b53a98ea677c 100644 --- a/src/main/java/seedu/address/storage/XmlAdaptedLoan.java +++ b/src/main/java/seedu/address/storage/XmlAdaptedLoan.java @@ -10,10 +10,14 @@ import javax.xml.bind.annotation.XmlElement; import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; @@ -27,11 +31,19 @@ public class XmlAdaptedLoan { @XmlElement(required = true) private String name; @XmlElement(required = true) + private String nric; + @XmlElement(required = true) private String phone; @XmlElement(required = true) private String email; @XmlElement(required = true) private String address; + @XmlElement(required = true) + private String bike; + @XmlElement(required = true) + private String rate; + @XmlElement(required = true) + private String time; @XmlElement private List tagged = new ArrayList<>(); @@ -45,11 +57,23 @@ public XmlAdaptedLoan() {} /** * Constructs an {@code XmlAdaptedLoan} with the given loan details. */ - public XmlAdaptedLoan(String name, String phone, String email, String address, List tagged) { + public XmlAdaptedLoan(String name, + String nric, + String phone, + String email, + String address, + String bike, + String rate, + String time, + List tagged) { this.name = name; + this.nric = nric; this.phone = phone; this.email = email; this.address = address; + this.bike = bike; + this.rate = rate; + this.time = time; if (tagged != null) { this.tagged = new ArrayList<>(tagged); } @@ -62,9 +86,13 @@ public XmlAdaptedLoan(String name, String phone, String email, String address, L */ public XmlAdaptedLoan(Loan source) { name = source.getName().value; + nric = source.getNric().nric; phone = source.getPhone().value; email = source.getEmail().value; address = source.getAddress().value; + bike = source.getBike().getName().value; + rate = source.getLoanRate().toString(); + time = source.getLoanTime().toString(); tagged = source.getTags().stream() .map(XmlAdaptedTag::new) .collect(Collectors.toList()); @@ -84,6 +112,20 @@ private void checkNameValid() throws IllegalValueException { } } + /** + * Throws an {@code IllegalValueException} if {@code nric} does not exist or is not valid. + * + * @throws IllegalValueException + */ + private void checkNricValid() 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_NRIC_CONSTRAINTS); + } + } + /** * Throws an {@code IllegalValueException} if {@code phone} does not exist or is not valid. * @@ -126,6 +168,50 @@ private void checkAddressValid() throws IllegalValueException { } } + /** + * Throws an {@code IllegalValueException} if {@code bike} does not exist or is not valid. + * + * @throws IllegalValueException + */ + private void checkBikeValid() throws IllegalValueException { + if (bike == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Bike.class.getSimpleName())); + } + if (!Name.isValidName(bike)) { + throw new IllegalValueException(Name.MESSAGE_NAME_CONSTRAINTS); + } + } + + /** + * Throws an {@code IllegalValueException} if {@code rate} does not exist or is not valid. + * + * @throws IllegalValueException + */ + private void checkLoanRateValid() throws IllegalValueException { + if (rate == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, + LoanRate.class.getSimpleName())); + } + if (!LoanRate.isValidRate(rate)) { + throw new IllegalValueException(LoanRate.MESSAGE_LOANRATE_CONSTRAINTS); + } + } + + /** + * Throws an {@code IllegalValueException} if {@code time} does not exist or is not valid. + * + * @throws IllegalValueException + */ + private void checkLoanTimeValid() throws IllegalValueException { + if (time == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, + LoanTime.class.getSimpleName())); + } + if (!LoanTime.isValidLoanTime(time)) { + throw new IllegalValueException(LoanTime.MESSAGE_LOANTIME_CONSTRAINTS); + } + } + /** * Converts this jaxb-friendly adapted loan object into the model's Loan object. * @@ -140,6 +226,9 @@ public Loan toModelType() throws IllegalValueException { checkNameValid(); final Name modelName = new Name(name); + checkNricValid(); + final Nric modelNric = new Nric(nric); + checkPhoneValid(); final Phone modelPhone = new Phone(phone); @@ -149,8 +238,25 @@ public Loan toModelType() throws IllegalValueException { checkAddressValid(); final Address modelAddress = new Address(address); + checkBikeValid(); + final Bike modelBike = new Bike(new Name(bike)); + + checkLoanRateValid(); + final LoanRate modelRate = new LoanRate(rate); + + checkLoanTimeValid(); + final LoanTime modelTime = new LoanTime(time); + final Set modelTags = new HashSet<>(loanTags); - return new Loan(modelName, modelPhone, modelEmail, modelAddress, modelTags); + return new Loan(modelName, + modelNric, + modelPhone, + modelEmail, + modelAddress, + modelBike, + modelRate, + modelTime, + modelTags); } @Override @@ -165,9 +271,13 @@ public boolean equals(Object other) { XmlAdaptedLoan otherLoan = (XmlAdaptedLoan) other; return Objects.equals(name, otherLoan.name) + && Objects.equals(nric, otherLoan.nric) && Objects.equals(phone, otherLoan.phone) && Objects.equals(email, otherLoan.email) && Objects.equals(address, otherLoan.address) + && Objects.equals(bike, otherLoan.bike) + && Objects.equals(rate, otherLoan.rate) + && Objects.equals(time, otherLoan.time) && tagged.equals(otherLoan.tagged); } } diff --git a/src/test/data/XmlSerializableLoanBookTest/duplicateLoanLoanBook.xml b/src/test/data/XmlSerializableLoanBookTest/duplicateLoanLoanBook.xml index 467e65811bf5..2690f6589e1c 100644 --- a/src/test/data/XmlSerializableLoanBookTest/duplicateLoanLoanBook.xml +++ b/src/test/data/XmlSerializableLoanBookTest/duplicateLoanLoanBook.xml @@ -3,18 +3,26 @@ Alice Pauline + S7508201J 94351253 alice@example.com
123, Jurong West Ave 6, #08-111
+ BIKE001 + 19.0 + friends
Alice Pauline + S7508201J 94351253 pauline@example.com
4th street
+ BIKE001 + 20.0 +
diff --git a/src/test/data/XmlSerializableLoanBookTest/typicalLoanBook.xml b/src/test/data/XmlSerializableLoanBookTest/typicalLoanBook.xml index 79c166948ec9..23ab1cc98789 100644 --- a/src/test/data/XmlSerializableLoanBookTest/typicalLoanBook.xml +++ b/src/test/data/XmlSerializableLoanBookTest/typicalLoanBook.xml @@ -15,48 +15,76 @@ Alice Pauline + S0848937H 94351253 alice@example.com
123, Jurong West Ave 6, #08-111
+ Bike001 + 1.1 + friends
Benson Meier + F1342714M 98765432 johnd@example.com
311, Clementi Ave 2, #02-25
+ Bike002 + 0.15 + owesMoney friends
Carl Kurz + T0238282I 95352563 heinz@example.com
wall street
+ Bike003 + 23.9 +
Daniel Meier + S9335895C 87652533 cornelia@example.com
10th street
+ Bike004 + 9.0 + friends
Elle Meyer + G9112925L 9482224 werner@example.com
michegan ave
+ Bike005 + 5.55 +
Fiona Kunz + G9400645M 9482427 lydia@example.com
little tokyo
+ Bike006 + 33.3 +
George Best + S8313623E 9482442 anna@example.com
4th street
+ Bike007 + 5.05 +
diff --git a/src/test/data/XmlUtilTest/invalidLoanField.xml b/src/test/data/XmlUtilTest/invalidLoanField.xml index acdc80be1b16..8cba226bf58d 100644 --- a/src/test/data/XmlUtilTest/invalidLoanField.xml +++ b/src/test/data/XmlUtilTest/invalidLoanField.xml @@ -2,8 +2,12 @@ Hans Muster + T0331476B 9482asf424 hans@example
4th street
+ BIKE001 + 30.6 + friends
diff --git a/src/test/data/XmlUtilTest/missingLoanField.xml b/src/test/data/XmlUtilTest/missingLoanField.xml index e77789fcd91c..c5703dad3e79 100644 --- a/src/test/data/XmlUtilTest/missingLoanField.xml +++ b/src/test/data/XmlUtilTest/missingLoanField.xml @@ -1,8 +1,12 @@ + T0331476B 9482424 hans@example
4th street
+ BIKE001 + 30.6 + friends
diff --git a/src/test/data/XmlUtilTest/validLoan.xml b/src/test/data/XmlUtilTest/validLoan.xml index 474584951f10..4d8bb6974c73 100644 --- a/src/test/data/XmlUtilTest/validLoan.xml +++ b/src/test/data/XmlUtilTest/validLoan.xml @@ -1,8 +1,12 @@ Hans Muster + T0331476B 9482424 hans@example
4th street
+ BIKE001 + 30.6 + friends
diff --git a/src/test/data/XmlUtilTest/validLoanBook.xml b/src/test/data/XmlUtilTest/validLoanBook.xml index c92a9b2089b0..a7ee97bc258e 100644 --- a/src/test/data/XmlUtilTest/validLoanBook.xml +++ b/src/test/data/XmlUtilTest/validLoanBook.xml @@ -2,56 +2,92 @@ Hans Muster + T0331476B 9482424 hans@example.com
4th street
+ BIKE001 + 30.6 +
Ruth Mueller + T0331476B 87249245 ruth@example.com
81th street
+ Bike01 + 12 +
Heinz Kurz + T0331476B 95352563 heinz@example.com
wall street
+ Bike01 + 12.0 +
Cornelia Meier + T0331476B 87652533 cornelia@example.com
10th street
+ Bike01 + 12.0 +
Werner Meyer + T0331476B 9482224 werner@example.com
michegan ave
+ Bike01 + 12.0 +
Lydia Kunz + T0331476B 9482427 lydia@example.com
little tokyo
+ Bike01 + 12.0 +
Anna Best + T0331476B 9482442 anna@example.com
4th street
+ Bike01 + 12.0 +
Stefan Meier + T0331476B 8482424 stefan@example.com
little india
+ Bike01 + 12.0 +
Martin Mueller + T0331476B 8482131 hans@example.com
chicago ave
+ Bike01 + 12.0 +
diff --git a/src/test/java/seedu/address/commons/util/XmlUtilTest.java b/src/test/java/seedu/address/commons/util/XmlUtilTest.java index cca9a87f6c36..d10c22df6387 100644 --- a/src/test/java/seedu/address/commons/util/XmlUtilTest.java +++ b/src/test/java/seedu/address/commons/util/XmlUtilTest.java @@ -37,9 +37,13 @@ public class XmlUtilTest { private static final String INVALID_PHONE = "9482asf424"; private static final String VALID_NAME = "Hans Muster"; + private static final String VALID_NRIC = "T0331476B"; private static final String VALID_PHONE = "9482424"; private static final String VALID_EMAIL = "hans@example"; private static final String VALID_ADDRESS = "4th street"; + private static final String VALID_BIKE = "BIKE001"; + private static final String VALID_LOANRATE = "30.6"; + private static final String VALID_LOANTIME = "2018-01-01 10:10"; private static final List VALID_TAGS = Collections.singletonList(new XmlAdaptedTag("friends")); @Rule @@ -79,8 +83,15 @@ public void getDataFromFile_validFile_validResult() throws Exception { public void xmlAdaptedLoanFromFile_fileWithMissingLoanField_validResult() throws Exception { XmlAdaptedLoan actualLoan = XmlUtil.getDataFromFile( MISSING_LOAN_FIELD_FILE, XmlAdaptedLoanWithRootElement.class); - XmlAdaptedLoan expectedLoan = new XmlAdaptedLoan( - null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + XmlAdaptedLoan expectedLoan = new XmlAdaptedLoan(null, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); assertEquals(expectedLoan, actualLoan); } @@ -88,8 +99,15 @@ public void xmlAdaptedLoanFromFile_fileWithMissingLoanField_validResult() throws public void xmlAdaptedLoanFromFile_fileWithInvalidLoanField_validResult() throws Exception { XmlAdaptedLoan actualLoan = XmlUtil.getDataFromFile( INVALID_LOAN_FIELD_FILE, XmlAdaptedLoanWithRootElement.class); - XmlAdaptedLoan expectedLoan = new XmlAdaptedLoan( - VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + XmlAdaptedLoan expectedLoan = new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + INVALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); assertEquals(expectedLoan, actualLoan); } @@ -97,8 +115,15 @@ public void xmlAdaptedLoanFromFile_fileWithInvalidLoanField_validResult() throws public void xmlAdaptedLoanFromFile_fileWithValidLoan_validResult() throws Exception { XmlAdaptedLoan actualLoan = XmlUtil.getDataFromFile( VALID_LOAN_FILE, XmlAdaptedLoanWithRootElement.class); - XmlAdaptedLoan expectedLoan = new XmlAdaptedLoan( - VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + XmlAdaptedLoan expectedLoan = new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); assertEquals(expectedLoan, actualLoan); } diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index e82ef1f52d19..4ad8f31304de 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -3,8 +3,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_BIKE; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANRATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANTIME; 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; @@ -28,12 +32,20 @@ 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_NRIC_AMY = "F1234567N"; + public static final String VALID_NRIC_BOB = "S1234567D"; public static final String VALID_PHONE_AMY = "11111111"; public static final String VALID_PHONE_BOB = "22222222"; 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_BIKE_AMY = "BIKE01"; + public static final String VALID_BIKE_BOB = "BIKE02"; + public static final String VALID_LOANRATE_AMY = "0.15"; + public static final String VALID_LOANRATE_BOB = "12.5"; + public static final String VALID_LOANTIME_AMY = "12:32"; + public static final String VALID_LOANTIME_BOB = "2018-10-10 12:30"; public static final String VALID_TAG_HUSBAND = "husband"; public static final String VALID_TAG_FRIEND = "friend"; @@ -44,12 +56,20 @@ public class CommandTestUtil { 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 ADDRESS_DESC_AMY = " " + PREFIX_ADDRESS + VALID_ADDRESS_AMY; public static final String ADDRESS_DESC_BOB = " " + PREFIX_ADDRESS + VALID_ADDRESS_BOB; + public static final String BIKE_DESC_AMY = " " + PREFIX_BIKE + VALID_BIKE_AMY; + public static final String BIKE_DESC_BOB = " " + PREFIX_BIKE + VALID_BIKE_BOB; + public static final String LOANRATE_DESC_AMY = " " + PREFIX_LOANRATE + VALID_LOANRATE_AMY; + public static final String LOANRATE_DESC_BOB = " " + PREFIX_LOANRATE + VALID_LOANRATE_BOB; + public static final String LOANTIME_DESC_AMY = " " + PREFIX_LOANTIME + VALID_LOANTIME_AMY; + public static final String LOANTIME_DESC_BOB = " " + PREFIX_LOANTIME + VALID_LOANTIME_BOB; public static final String TAG_DESC_FRIEND = " " + PREFIX_TAG + VALID_TAG_FRIEND; public static final String TAG_DESC_HUSBAND = " " + PREFIX_TAG + VALID_TAG_HUSBAND; @@ -59,9 +79,13 @@ public class CommandTestUtil { public static final String NAME_DESC_BIKE4 = " " + PREFIX_NAME + VALID_NAME_BIKE4; public static final String INVALID_NAME_DESC = " " + PREFIX_NAME + "James&"; // '&' not allowed in names + public static final String INVALID_NRIC_DESC = " " + PREFIX_NRIC + "S*055310A"; // wrong format 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_BIKE_DESC = " " + PREFIX_BIKE + "***BIKE"; // '*' not allowed in bike names + public static final String INVALID_LOANRATE_DESC = " " + PREFIX_LOANRATE + "1.4444"; // 'no more than 2 decimals + public static final String INVALID_LOANTIME_DESC = " " + PREFIX_LOANTIME + "1232"; // missing ':' symbol public static final String INVALID_TAG_DESC = " " + PREFIX_TAG + "hubby*"; // '*' not allowed in tags public static final String PREAMBLE_WHITESPACE = "\t \r \n"; @@ -72,10 +96,18 @@ public class CommandTestUtil { static { DESC_AMY = new EditLoanDescriptorBuilder().withName(VALID_NAME_AMY) + .withNric(VALID_NRIC_AMY) .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) + .withBike(VALID_BIKE_AMY) + .withLoanRate(VALID_LOANRATE_AMY) + .withLoanTime(VALID_LOANTIME_AMY) .withTags(VALID_TAG_FRIEND).build(); DESC_BOB = new EditLoanDescriptorBuilder().withName(VALID_NAME_BOB) + .withNric(VALID_NRIC_BOB) .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB) + .withBike(VALID_BIKE_BOB) + .withLoanRate(VALID_LOANRATE_BOB) + .withLoanTime(VALID_LOANTIME_BOB) .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); } diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java index fe2235969d37..1efff6b472f3 100644 --- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java @@ -3,15 +3,27 @@ import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.BIKE_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.BIKE_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_BIKE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_LOANRATE_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_LOANTIME_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_NRIC_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.LOANRATE_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.LOANRATE_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.LOANTIME_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.LOANTIME_DESC_BOB; 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; @@ -32,10 +44,12 @@ import org.junit.Test; import seedu.address.logic.commands.AddCommand; -import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; import seedu.address.testutil.LoanBuilder; @@ -48,29 +62,55 @@ public void parse_allFieldsPresent_success() { Loan expectedLoan = new LoanBuilder(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(expectedLoan)); + assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); // multiple names - last name accepted - assertParseSuccess(parser, NAME_DESC_AMY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); + assertParseSuccess(parser, NAME_DESC_AMY + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); + + // multiple nrics - last nric accepted + assertParseSuccess(parser, NAME_DESC_BOB + NRIC_DESC_AMY + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); // multiple phones - last phone accepted - assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_AMY + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); + assertParseSuccess(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_AMY + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); // multiple emails - last email accepted - assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_AMY + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); - - // multiple addresses - last address accepted - assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_AMY - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); + assertParseSuccess(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_AMY + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); + + // multiple bikes - last bike accepted + assertParseSuccess(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_AMY + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); + + // multiple rates - last rate accepted + assertParseSuccess(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_AMY + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); + + // multiple times - last time accepted + assertParseSuccess(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_AMY + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND, new AddCommand(expectedLoan)); // multiple tags - all accepted Loan expectedLoanMultipleTags = new LoanBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND) .build(); - assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + assertParseSuccess(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, new AddCommand(expectedLoanMultipleTags)); } @@ -78,7 +118,8 @@ public void parse_allFieldsPresent_success() { public void parse_optionalFieldsMissing_success() { // zero tags Loan expectedLoan = new LoanBuilder(AMY).withTags().build(); - assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY, + assertParseSuccess(parser, NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY, new AddCommand(expectedLoan)); } @@ -110,32 +151,54 @@ 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 + assertParseFailure(parser, INVALID_NAME_DESC + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_NAME_CONSTRAINTS); + // invalid nric + assertParseFailure(parser, NAME_DESC_BOB + INVALID_NRIC_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Nric.MESSAGE_NRIC_CONSTRAINTS); + // invalid phone - assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_PHONE_CONSTRAINTS); // invalid email - assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB + assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_EMAIL_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_ADDRESS_CONSTRAINTS); + // invalid bike + assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + INVALID_BIKE_DESC + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_NAME_CONSTRAINTS); + + // invalid rate + assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + INVALID_LOANRATE_DESC + LOANTIME_DESC_BOB + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, LoanRate.MESSAGE_LOANRATE_CONSTRAINTS); + + // invalid time + assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + INVALID_LOANTIME_DESC + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, LoanTime.MESSAGE_LOANTIME_CONSTRAINTS); // invalid tag - assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + assertParseFailure(parser, NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_TAG_CONSTRAINTS); // two invalid values, only first invalid value reported - assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC, + assertParseFailure(parser, INVALID_NAME_DESC + NRIC_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + + INVALID_ADDRESS_DESC + INVALID_BIKE_DESC + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB, Name.MESSAGE_NAME_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, + assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } } diff --git a/src/test/java/seedu/address/model/loan/LoanTest.java b/src/test/java/seedu/address/model/loan/LoanTest.java index 7de476d86210..a1d627528079 100644 --- a/src/test/java/seedu/address/model/loan/LoanTest.java +++ b/src/test/java/seedu/address/model/loan/LoanTest.java @@ -3,8 +3,12 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_BIKE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANRATE_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANTIME_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.TypicalLoans.ALICE; @@ -35,27 +39,49 @@ public void isSameLoan() { // null -> returns false assertFalse(ALICE.isSameLoan(null)); - // different phone and email -> returns false - Loan editedAlice = new LoanBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).build(); + // different name -> returns false + Loan editedAlice = new LoanBuilder(ALICE).withName(VALID_NAME_BOB).build(); assertFalse(ALICE.isSameLoan(editedAlice)); - // different name -> returns false - editedAlice = new LoanBuilder(ALICE).withName(VALID_NAME_BOB).build(); + // different nric -> returns false + editedAlice = new LoanBuilder(ALICE).withNric(VALID_NRIC_BOB).build(); + assertFalse(ALICE.isSameLoan(editedAlice)); + + // different bike -> returns false + editedAlice = new LoanBuilder(ALICE).withBike(VALID_BIKE_BOB).build(); + assertFalse(ALICE.isSameLoan(editedAlice)); + + // different phone, email, rate and time -> returns false + editedAlice = new LoanBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB) + .withLoanRate(VALID_LOANRATE_BOB).withLoanTime(VALID_LOANTIME_BOB).build(); assertFalse(ALICE.isSameLoan(editedAlice)); - // same name, same phone, different attributes -> returns true + // same identity fields, same phone, different attributes -> returns true editedAlice = new LoanBuilder(ALICE).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB) .withTags(VALID_TAG_HUSBAND).build(); assertTrue(ALICE.isSameLoan(editedAlice)); - // same name, same email, different attributes -> returns true + // same identity fields, same email, different attributes -> returns true editedAlice = new LoanBuilder(ALICE).withPhone(VALID_PHONE_BOB).withAddress(VALID_ADDRESS_BOB) .withTags(VALID_TAG_HUSBAND).build(); assertTrue(ALICE.isSameLoan(editedAlice)); - // same name, same phone, same email, different attributes -> returns true + // same identity fields, same phone, same email, different attributes -> returns true editedAlice = new LoanBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build(); assertTrue(ALICE.isSameLoan(editedAlice)); + + // same identity fields, different rate -> returns true + editedAlice = new LoanBuilder(ALICE).withLoanRate(VALID_LOANRATE_BOB).withTags(VALID_TAG_HUSBAND).build(); + assertTrue(ALICE.isSameLoan(editedAlice)); + + // same identity fields, different time -> returns true + editedAlice = new LoanBuilder(ALICE).withLoanTime(VALID_LOANTIME_BOB).withTags(VALID_TAG_HUSBAND).build(); + assertTrue(ALICE.isSameLoan(editedAlice)); + + // same identity fields, different rate and time -> returns true + editedAlice = new LoanBuilder(ALICE).withLoanRate(VALID_LOANRATE_BOB).withLoanTime(VALID_LOANTIME_BOB) + .withTags(VALID_TAG_HUSBAND).build(); + assertTrue(ALICE.isSameLoan(editedAlice)); } @Test diff --git a/src/test/java/seedu/address/storage/XmlAdaptedLoanTest.java b/src/test/java/seedu/address/storage/XmlAdaptedLoanTest.java index 2249d709bc40..003e51110ee9 100644 --- a/src/test/java/seedu/address/storage/XmlAdaptedLoanTest.java +++ b/src/test/java/seedu/address/storage/XmlAdaptedLoanTest.java @@ -11,23 +11,35 @@ import org.junit.Test; import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.testutil.Assert; public class XmlAdaptedLoanTest { private static final String INVALID_NAME = "R@chel"; + private static final String INVALID_NRIC = "A12#4567B"; private static final String INVALID_PHONE = "+651234"; private static final String INVALID_ADDRESS = " "; private static final String INVALID_EMAIL = "example.com"; + private static final String INVALID_BIKE = "001B^^E"; + private static final String INVALID_LOANRATE = "12.333"; + private static final String INVALID_LOANTIME = "2017-02-30 12:56"; private static final String INVALID_TAG = "#friend"; private static final String VALID_NAME = BENSON.getName().toString(); + private static final String VALID_NRIC = BENSON.getNric().toString(); 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_BIKE = BENSON.getBike().getName().toString(); + private static final String VALID_LOANRATE = BENSON.getLoanRate().toString(); + private static final String VALID_LOANTIME = BENSON.getLoanTime().toString(); private static final List VALID_TAGS = BENSON.getTags().stream() .map(XmlAdaptedTag::new) .collect(Collectors.toList()); @@ -41,29 +53,95 @@ public void toModelTypeValidLoanDetails_returnsLoan() throws Exception { @Test public void toModelTypeInvalidNameThrowsIllegalValueException() { XmlAdaptedLoan loan = - new XmlAdaptedLoan(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + new XmlAdaptedLoan(INVALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = Name.MESSAGE_NAME_CONSTRAINTS; Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } @Test public void toModelTypeNullNameThrowsIllegalValueException() { - XmlAdaptedLoan loan = new XmlAdaptedLoan(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + XmlAdaptedLoan loan = + new XmlAdaptedLoan(null, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()); Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } + @Test + public void toModelTypeInvalidNricThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + INVALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); + String expectedMessage = Nric.MESSAGE_NRIC_CONSTRAINTS; + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + + @Test + public void toModelTypeNullNricThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + null, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); + String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Nric.class.getSimpleName()); + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + @Test public void toModelTypeInvalidPhoneThrowsIllegalValueException() { XmlAdaptedLoan loan = - new XmlAdaptedLoan(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + INVALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = Phone.MESSAGE_PHONE_CONSTRAINTS; Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } @Test public void toModelTypeNullPhoneThrowsIllegalValueException() { - XmlAdaptedLoan loan = new XmlAdaptedLoan(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + null, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()); Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } @@ -71,14 +149,31 @@ public void toModelTypeNullPhoneThrowsIllegalValueException() { @Test public void toModelTypeInvalidEmailThrowsIllegalValueException() { XmlAdaptedLoan loan = - new XmlAdaptedLoan(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + INVALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = Email.MESSAGE_EMAIL_CONSTRAINTS; Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } @Test public void toModelTypeNullEmailThrowsIllegalValueException() { - XmlAdaptedLoan loan = new XmlAdaptedLoan(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS); + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + null, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()); Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } @@ -86,24 +181,145 @@ public void toModelTypeNullEmailThrowsIllegalValueException() { @Test public void toModelTypeInvalidAddressThrowsIllegalValueException() { XmlAdaptedLoan loan = - new XmlAdaptedLoan(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS); + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + INVALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = Address.MESSAGE_ADDRESS_CONSTRAINTS; Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } @Test public void toModelTypeNullAddressThrowsIllegalValueException() { - XmlAdaptedLoan loan = new XmlAdaptedLoan(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS); + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + null, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()); Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); } + @Test + public void toModelTypeInvalidBikeThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + INVALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); + String expectedMessage = Name.MESSAGE_NAME_CONSTRAINTS; + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + + @Test + public void toModelTypeNullBikeThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + null, + VALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); + String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Bike.class.getSimpleName()); + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + + @Test + public void toModelTypeInvalidLoanRateThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + INVALID_LOANRATE, + VALID_LOANTIME, + VALID_TAGS); + String expectedMessage = LoanRate.MESSAGE_LOANRATE_CONSTRAINTS; + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + + @Test + public void toModelTypeNullLoanRateThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + null, + VALID_LOANTIME, + VALID_TAGS); + String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, LoanRate.class.getSimpleName()); + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + + @Test + public void toModelTypeInvalidLoanTimeThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + INVALID_LOANTIME, + VALID_TAGS); + String expectedMessage = LoanTime.MESSAGE_LOANTIME_CONSTRAINTS; + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + + @Test + public void toModelTypeNullLoanTimeThrowsIllegalValueException() { + XmlAdaptedLoan loan = + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + null, + VALID_TAGS); + String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, LoanTime.class.getSimpleName()); + Assert.assertThrows(IllegalValueException.class, expectedMessage, loan::toModelType); + } + @Test public void toModelTypeInvalidTagsThrowsIllegalValueException() { List invalidTags = new ArrayList<>(VALID_TAGS); invalidTags.add(new XmlAdaptedTag(INVALID_TAG)); XmlAdaptedLoan loan = - new XmlAdaptedLoan(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags); + new XmlAdaptedLoan(VALID_NAME, + VALID_NRIC, + VALID_PHONE, + VALID_EMAIL, + VALID_ADDRESS, + VALID_BIKE, + VALID_LOANRATE, + VALID_LOANTIME, + invalidTags); Assert.assertThrows(IllegalValueException.class, loan::toModelType); } diff --git a/src/test/java/seedu/address/testutil/EditLoanDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditLoanDescriptorBuilder.java index 51cc607d9cc9..10ef99b532f6 100644 --- a/src/test/java/seedu/address/testutil/EditLoanDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditLoanDescriptorBuilder.java @@ -6,10 +6,14 @@ import seedu.address.logic.commands.EditCommand; import seedu.address.logic.commands.EditCommand.EditLoanDescriptor; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; @@ -34,9 +38,13 @@ public EditLoanDescriptorBuilder(EditCommand.EditLoanDescriptor descriptor) { public EditLoanDescriptorBuilder(Loan loan) { descriptor = new EditCommand.EditLoanDescriptor(); descriptor.setName(loan.getName()); + descriptor.setNric(loan.getNric()); descriptor.setPhone(loan.getPhone()); descriptor.setEmail(loan.getEmail()); descriptor.setAddress(loan.getAddress()); + descriptor.setBike(loan.getBike()); + descriptor.setLoanRate(loan.getLoanRate()); + descriptor.setLoanTime(loan.getLoanTime()); descriptor.setTags(loan.getTags()); } @@ -48,6 +56,14 @@ public EditLoanDescriptorBuilder withName(String name) { return this; } + /** + * Sets the {@code Nric} of the {@code EditLoanDescriptor} that we are building. + */ + public EditLoanDescriptorBuilder withNric(String nric) { + descriptor.setNric(new Nric(nric)); + return this; + } + /** * Sets the {@code Phone} of the {@code EditLoanDescriptor} that we are building. */ @@ -72,6 +88,30 @@ public EditLoanDescriptorBuilder withAddress(String address) { return this; } + /** + * Sets the {@code Bike} of the {@code EditLoanDescriptor} that we are building. + */ + public EditLoanDescriptorBuilder withBike(String bike) { + descriptor.setBike(new Bike(new Name(bike))); + return this; + } + + /** + * Sets the {@code LoanRate} of the {@code EditLoanDescriptor} that we are building. + */ + public EditLoanDescriptorBuilder withLoanRate(String rate) { + descriptor.setLoanRate(new LoanRate(rate)); + return this; + } + + /** + * Sets the {@code LoanTime} of the {@code EditLoanDescriptor} that we are building. + */ + public EditLoanDescriptorBuilder withLoanTime(String time) { + descriptor.setLoanTime(new LoanTime(time)); + return this; + } + /** * Parses the {@code tags} into a {@code Set} and set it to the {@code EditLoanDescriptor} * that we are building. diff --git a/src/test/java/seedu/address/testutil/LoanBuilder.java b/src/test/java/seedu/address/testutil/LoanBuilder.java index c9a5cdd0a738..b1379dce5c0f 100644 --- a/src/test/java/seedu/address/testutil/LoanBuilder.java +++ b/src/test/java/seedu/address/testutil/LoanBuilder.java @@ -3,10 +3,14 @@ import java.util.HashSet; import java.util.Set; +import seedu.address.model.bike.Bike; import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; import seedu.address.model.util.SampleDataUtil; @@ -17,21 +21,33 @@ public class LoanBuilder { public static final String DEFAULT_NAME = "Alice Pauline"; + public static final String DEFAULT_NRIC = "G1234567X"; public static final String DEFAULT_PHONE = "85355255"; public static final String DEFAULT_EMAIL = "alice@gmail.com"; public static final String DEFAULT_ADDRESS = "123, Jurong West Ave 6, #08-111"; + public static final String DEFAULT_BIKE = "BIKE999"; + public static final String DEFAULT_LOANRATE = "12.3"; + public static final String DEFAULT_LOANTIME = "12:45"; private Name name; + private Nric nric; private Phone phone; private Email email; private Address address; + private Bike bike; + private LoanRate rate; + private LoanTime time; private Set tags; public LoanBuilder() { 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); + bike = new Bike(new Name(DEFAULT_BIKE)); + rate = new LoanRate(DEFAULT_LOANRATE); + time = new LoanTime(DEFAULT_LOANTIME); tags = new HashSet<>(); } @@ -40,9 +56,13 @@ public LoanBuilder() { */ public LoanBuilder(Loan loanToCopy) { name = loanToCopy.getName(); + nric = loanToCopy.getNric(); phone = loanToCopy.getPhone(); email = loanToCopy.getEmail(); address = loanToCopy.getAddress(); + bike = loanToCopy.getBike(); + rate = loanToCopy.getLoanRate(); + time = loanToCopy.getLoanTime(); tags = new HashSet<>(loanToCopy.getTags()); } @@ -54,6 +74,14 @@ public LoanBuilder withName(String name) { return this; } + /** + * Sets the {@code Nric} of the {@code Loan} that we are building. + */ + public LoanBuilder withNric(String nric) { + this.nric = new Nric(nric); + return this; + } + /** * Parses the {@code tags} into a {@code Set} and set it to the {@code Loan} that we are building. */ @@ -86,8 +114,32 @@ public LoanBuilder withEmail(String email) { return this; } + /** + * Sets the {@code Bike} of the {@code Loan} that we are building. + */ + public LoanBuilder withBike(String bike) { + this.bike = new Bike(new Name(bike)); + return this; + } + + /** + * Sets the {@code LoanRate} of the {@code Loan} that we are building. + */ + public LoanBuilder withLoanRate(String rate) { + this.rate = new LoanRate(rate); + return this; + } + + /** + * Sets the {@code LoanTime} of the {@code Loan} that we are building. + */ + public LoanBuilder withLoanTime(String time) { + this.time = new LoanTime(time); + return this; + } + public Loan build() { - return new Loan(name, phone, email, address, tags); + return new Loan(name, nric, phone, email, address, bike, rate, time, tags); } } diff --git a/src/test/java/seedu/address/testutil/LoanUtil.java b/src/test/java/seedu/address/testutil/LoanUtil.java index 18b734dc261a..3f9d654b2681 100644 --- a/src/test/java/seedu/address/testutil/LoanUtil.java +++ b/src/test/java/seedu/address/testutil/LoanUtil.java @@ -1,8 +1,12 @@ package seedu.address.testutil; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_BIKE; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANRATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_LOANTIME; 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; @@ -31,9 +35,13 @@ public static String getAddCommand(Loan loan) { public static String getLoanDetails(Loan loan) { StringBuilder sb = new StringBuilder(); sb.append(PREFIX_NAME + loan.getName().value + " "); + sb.append(PREFIX_NRIC + loan.getNric().toString() + " "); sb.append(PREFIX_PHONE + loan.getPhone().value + " "); sb.append(PREFIX_EMAIL + loan.getEmail().value + " "); sb.append(PREFIX_ADDRESS + loan.getAddress().value + " "); + sb.append(PREFIX_BIKE + loan.getBike().getName().value + " "); + sb.append(PREFIX_LOANRATE + loan.getLoanRate().toString() + " "); + sb.append(PREFIX_LOANTIME + loan.getLoanTime().toString() + " "); loan.getTags().stream().forEach( s -> sb.append(PREFIX_TAG + s.value + " ") ); @@ -46,9 +54,13 @@ public static String getLoanDetails(Loan loan) { public static String getEditLoanDescriptorDetails(EditLoanDescriptor descriptor) { StringBuilder sb = new StringBuilder(); descriptor.getName().ifPresent(name -> sb.append(PREFIX_NAME).append(name.value).append(" ")); + descriptor.getNric().ifPresent(nric -> sb.append(PREFIX_NRIC).append(nric.toString()).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(" ")); + descriptor.getBike().ifPresent(bike -> sb.append(PREFIX_BIKE).append(bike.getName().value).append(" ")); + descriptor.getLoanRate().ifPresent(rate -> sb.append(PREFIX_LOANRATE).append(rate.value).append(" ")); + descriptor.getLoanTime().ifPresent(time -> sb.append(PREFIX_LOANTIME).append(time.toString()).append(" ")); if (descriptor.getTags().isPresent()) { Set tags = descriptor.getTags().get(); if (tags.isEmpty()) { diff --git a/src/test/java/seedu/address/testutil/TypicalLoans.java b/src/test/java/seedu/address/testutil/TypicalLoans.java index 310dcdfb7538..e43b678b2dc4 100644 --- a/src/test/java/seedu/address/testutil/TypicalLoans.java +++ b/src/test/java/seedu/address/testutil/TypicalLoans.java @@ -2,10 +2,18 @@ import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_BIKE_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_BIKE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANRATE_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANRATE_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANTIME_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANTIME_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NRIC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NRIC_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND; @@ -23,35 +31,107 @@ public class TypicalLoans { public static final Loan ALICE = new LoanBuilder().withName("Alice Pauline") + .withNric("S0848937H") .withAddress("123, Jurong West Ave 6, #08-111").withEmail("alice@example.com") .withPhone("94351253") + .withBike("Bike001") + .withLoanRate("1.1") + .withLoanTime("12:33") .withTags("friends").build(); public static final Loan BENSON = new LoanBuilder().withName("Benson Meier") + .withNric("F1342714M") .withAddress("311, Clementi Ave 2, #02-25") .withEmail("johnd@example.com").withPhone("98765432") + .withBike("Bike002") + .withLoanRate("0.15") + .withLoanTime("2017-10-12 06:08") .withTags("owesMoney", "friends").build(); - public static final Loan CARL = new LoanBuilder().withName("Carl Kurz").withPhone("95352563") - .withEmail("heinz@example.com").withAddress("wall street").build(); - public static final Loan DANIEL = new LoanBuilder().withName("Daniel Meier").withPhone("87652533") - .withEmail("cornelia@example.com").withAddress("10th street").withTags("friends").build(); - public static final Loan ELLE = new LoanBuilder().withName("Elle Meyer").withPhone("9482224") - .withEmail("werner@example.com").withAddress("michegan ave").build(); - public static final Loan FIONA = new LoanBuilder().withName("Fiona Kunz").withPhone("9482427") - .withEmail("lydia@example.com").withAddress("little tokyo").build(); - public static final Loan GEORGE = new LoanBuilder().withName("George Best").withPhone("9482442") - .withEmail("anna@example.com").withAddress("4th street").build(); + public static final Loan CARL = new LoanBuilder().withName("Carl Kurz") + .withNric("T0238282I") + .withPhone("95352563") + .withEmail("heinz@example.com") + .withAddress("wall street") + .withBike("Bike003") + .withLoanRate("23.9") + .withLoanTime("14:20") + .build(); + public static final Loan DANIEL = new LoanBuilder().withName("Daniel Meier") + .withNric("S9335895C") + .withPhone("87652533") + .withEmail("cornelia@example.com") + .withAddress("10th street") + .withBike("Bike004") + .withLoanRate("9.0") + .withLoanTime("17:56") + .withTags("friends").build(); + public static final Loan ELLE = new LoanBuilder().withName("Elle Meyer") + .withNric("G9112925L") + .withPhone("9482224") + .withEmail("werner@example.com") + .withAddress("michegan ave") + .withBike("Bike005") + .withLoanRate("5.55") + .withLoanTime("2010-12-30 10:30") + .build(); + public static final Loan FIONA = new LoanBuilder().withName("Fiona Kunz") + .withNric("G9400645M") + .withPhone("9482427") + .withEmail("lydia@example.com") + .withAddress("little tokyo") + .withBike("Bike006") + .withLoanRate("33.3") + .withLoanTime("01:01") + .build(); + public static final Loan GEORGE = new LoanBuilder().withName("George Best") + .withNric("S8313623E") + .withPhone("9482442") + .withEmail("anna@example.com") + .withAddress("4th street") + .withBike("Bike007") + .withLoanRate("5.05") + .withLoanTime("2013-03-13 12:08") + .build(); // Manually added - public static final Loan HOON = new LoanBuilder().withName("Hoon Meier").withPhone("8482424") - .withEmail("stefan@example.com").withAddress("little india").build(); - public static final Loan IDA = new LoanBuilder().withName("Ida Mueller").withPhone("8482131") - .withEmail("hans@example.com").withAddress("chicago ave").build(); + public static final Loan HOON = new LoanBuilder().withName("Hoon Meier") + .withNric("T0127601D") + .withPhone("8482424") + .withEmail("stefan@example.com") + .withAddress("little india") + .withBike("Bike008") + .withLoanRate("8.9") + .withLoanTime("16:45") + .build(); + public static final Loan IDA = new LoanBuilder().withName("Ida Mueller") + .withNric("S9739813E") + .withPhone("8482131") + .withEmail("hans@example.com") + .withAddress("chicago ave") + .withBike("Bike009") + .withLoanRate("7.65") + .withLoanTime("2017-09-08 18:08") + .build(); // Manually added - Loan's details found in {@code CommandTestUtil} - public static final Loan AMY = new LoanBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY) - .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build(); - public static final Loan BOB = new LoanBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB) - .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND) + public static final Loan AMY = new LoanBuilder().withName(VALID_NAME_AMY) + .withNric(VALID_NRIC_AMY) + .withPhone(VALID_PHONE_AMY) + .withEmail(VALID_EMAIL_AMY) + .withAddress(VALID_ADDRESS_AMY) + .withTags(VALID_TAG_FRIEND) + .withBike(VALID_BIKE_AMY) + .withLoanRate(VALID_LOANRATE_AMY) + .withLoanTime(VALID_LOANTIME_AMY) + .build(); + public static final Loan BOB = new LoanBuilder().withName(VALID_NAME_BOB) + .withNric(VALID_NRIC_BOB) + .withPhone(VALID_PHONE_BOB) + .withEmail(VALID_EMAIL_BOB) + .withAddress(VALID_ADDRESS_BOB) + .withBike(VALID_BIKE_BOB) + .withLoanRate(VALID_LOANRATE_BOB) + .withLoanTime(VALID_LOANTIME_BOB) + .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND) .build(); public static final String KEYWORD_MATCHING_MEIER = "Meier"; // A keyword that matches MEIER diff --git a/src/test/java/seedu/address/ui/LoanListPanelTest.java b/src/test/java/seedu/address/ui/LoanListPanelTest.java index 7e9103756665..495efcf5c934 100644 --- a/src/test/java/seedu/address/ui/LoanListPanelTest.java +++ b/src/test/java/seedu/address/ui/LoanListPanelTest.java @@ -96,9 +96,13 @@ private Path createXmlFileWithLoans(int loanCount) throws Exception { for (int i = 0; i < loanCount; i++) { builder.append("\n"); builder.append("").append(i).append("a\n"); + builder.append("S9249123D\n"); builder.append("000\n"); builder.append("a@aa\n"); builder.append("
a
\n"); + builder.append("b\n"); + builder.append("1\n"); + builder.append("\n"); builder.append("
\n"); } builder.append("\n"); diff --git a/src/test/java/systemtests/AddCommandSystemTest.java b/src/test/java/systemtests/AddCommandSystemTest.java index 180f6044a5b2..df42910de371 100644 --- a/src/test/java/systemtests/AddCommandSystemTest.java +++ b/src/test/java/systemtests/AddCommandSystemTest.java @@ -3,22 +3,36 @@ import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.BIKE_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.BIKE_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB; -import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_BIKE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_LOANRATE_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_LOANTIME_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_NRIC_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.LOANRATE_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.LOANRATE_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.LOANTIME_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.LOANTIME_DESC_BOB; 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.TAG_DESC_FRIEND; import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; -import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_BIKE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANRATE_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANTIME_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.parser.CliSyntax.PREFIX_TAG; import static seedu.address.testutil.TypicalLoans.ALICE; @@ -37,10 +51,12 @@ import seedu.address.logic.commands.RedoCommand; import seedu.address.logic.commands.UndoCommand; import seedu.address.model.Model; -import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; import seedu.address.testutil.LoanBuilder; @@ -58,8 +74,10 @@ public void add() { * -> added */ Loan toAdd = AMY; - String command = " " + AddCommand.COMMAND_WORD + " " + NAME_DESC_AMY + " " + PHONE_DESC_AMY + " " - + EMAIL_DESC_AMY + " " + ADDRESS_DESC_AMY + " " + TAG_DESC_FRIEND + " "; + String command = " " + AddCommand.COMMAND_WORD + " " + NAME_DESC_AMY + " " + NRIC_DESC_AMY + " " + + PHONE_DESC_AMY + " " + EMAIL_DESC_AMY + " " + ADDRESS_DESC_AMY + " " + + BIKE_DESC_AMY + " " + LOANRATE_DESC_AMY + " " + LOANTIME_DESC_AMY + " " + + TAG_DESC_FRIEND + " "; assertCommandSuccess(command, toAdd); /* Case: undo adding Amy to the list -> Amy deleted */ @@ -75,14 +93,17 @@ public void add() { /* Case: add a loan with all fields same as another loan in the loan book except name -> added */ toAdd = new LoanBuilder(AMY).withName(VALID_NAME_BOB).build(); - command = AddCommand.COMMAND_WORD + NAME_DESC_BOB + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY - + TAG_DESC_FRIEND; + command = AddCommand.COMMAND_WORD + NAME_DESC_BOB + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY + TAG_DESC_FRIEND; assertCommandSuccess(command, toAdd); - /* Case: add a loan with all fields same as another loan in the loan book except phone and email - * -> added - */ - toAdd = new LoanBuilder(AMY).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).build(); + /* Case: add a loan with all fields same as another loan in the loan book except nric -> added */ + toAdd = new LoanBuilder(AMY).withNric(VALID_NRIC_BOB).build(); + command = LoanUtil.getAddCommand(toAdd); + assertCommandSuccess(command, toAdd); + + /* Case: add a loan with all fields same as another loan in the loan book except bike -> added */ + toAdd = new LoanBuilder(AMY).withBike(VALID_BIKE_BOB).build(); command = LoanUtil.getAddCommand(toAdd); assertCommandSuccess(command, toAdd); @@ -93,7 +114,8 @@ public void add() { /* Case: add a loan with tags, command with parameters in random order -> added */ toAdd = BOB; command = AddCommand.COMMAND_WORD + TAG_DESC_FRIEND + PHONE_DESC_BOB + ADDRESS_DESC_BOB + NAME_DESC_BOB - + TAG_DESC_HUSBAND + EMAIL_DESC_BOB; + + TAG_DESC_HUSBAND + EMAIL_DESC_BOB + LOANTIME_DESC_BOB + BIKE_DESC_BOB + NRIC_DESC_BOB + + LOANRATE_DESC_BOB; assertCommandSuccess(command, toAdd); /* Case: add a loan, missing tags -> added */ @@ -127,8 +149,13 @@ public void add() { command = LoanUtil.getAddCommand(toAdd); assertCommandFailure(command, AddCommand.MESSAGE_DUPLICATE_LOAN); - /* Case: add a duplicate loan except with different address -> rejected */ - toAdd = new LoanBuilder(HOON).withAddress(VALID_ADDRESS_BOB).build(); + /* Case: add a duplicate loan except with different loanrate -> rejected */ + toAdd = new LoanBuilder(HOON).withLoanRate(VALID_LOANRATE_BOB).build(); + command = LoanUtil.getAddCommand(toAdd); + assertCommandFailure(command, AddCommand.MESSAGE_DUPLICATE_LOAN); + + /* Case: add a duplicate loan except with different loantime -> rejected */ + toAdd = new LoanBuilder(HOON).withLoanTime(VALID_LOANTIME_BOB).build(); command = LoanUtil.getAddCommand(toAdd); assertCommandFailure(command, AddCommand.MESSAGE_DUPLICATE_LOAN); @@ -137,19 +164,38 @@ public void add() { assertCommandFailure(command, AddCommand.MESSAGE_DUPLICATE_LOAN); /* Case: missing name -> rejected */ - command = AddCommand.COMMAND_WORD + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY; + command = AddCommand.COMMAND_WORD + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; assertCommandFailure(command, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); /* Case: missing phone -> rejected */ - command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY; + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; assertCommandFailure(command, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); /* Case: missing email -> rejected */ - command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + ADDRESS_DESC_AMY; + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + ADDRESS_DESC_AMY + + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; + assertCommandFailure(command, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); + + /* Case: missing nric -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; + assertCommandFailure(command, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); + + /* Case: missing bike -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; + assertCommandFailure(command, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); + + /* Case: missing loan rate -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANTIME_DESC_AMY; assertCommandFailure(command, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); - /* Case: missing address -> rejected */ - command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY; + /* Case: missing loan time -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY; assertCommandFailure(command, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); /* Case: invalid keyword -> rejected */ @@ -157,24 +203,43 @@ public void add() { assertCommandFailure(command, Messages.MESSAGE_UNKNOWN_COMMAND); /* Case: invalid name -> rejected */ - command = AddCommand.COMMAND_WORD + INVALID_NAME_DESC + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY; + command = AddCommand.COMMAND_WORD + INVALID_NAME_DESC + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; assertCommandFailure(command, Name.MESSAGE_NAME_CONSTRAINTS); + /* Case: invalid nric -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + INVALID_NRIC_DESC + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; + assertCommandFailure(command, Nric.MESSAGE_NRIC_CONSTRAINTS); + /* Case: invalid phone -> rejected */ - command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + INVALID_PHONE_DESC + EMAIL_DESC_AMY + ADDRESS_DESC_AMY; + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + INVALID_PHONE_DESC + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; assertCommandFailure(command, Phone.MESSAGE_PHONE_CONSTRAINTS); /* Case: invalid email -> rejected */ - command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + INVALID_EMAIL_DESC + ADDRESS_DESC_AMY; + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + INVALID_EMAIL_DESC + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; assertCommandFailure(command, Email.MESSAGE_EMAIL_CONSTRAINTS); - /* Case: invalid address -> rejected */ - command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + INVALID_ADDRESS_DESC; - assertCommandFailure(command, Address.MESSAGE_ADDRESS_CONSTRAINTS); + /* Case: invalid bike -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + INVALID_BIKE_DESC + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY; + assertCommandFailure(command, Name.MESSAGE_NAME_CONSTRAINTS); + + /* Case: invalid rate -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + INVALID_LOANRATE_DESC + LOANTIME_DESC_AMY; + assertCommandFailure(command, LoanRate.MESSAGE_LOANRATE_CONSTRAINTS); + + /* Case: invalid time -> rejected */ + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + INVALID_LOANTIME_DESC; + assertCommandFailure(command, LoanTime.MESSAGE_LOANTIME_CONSTRAINTS); /* Case: invalid tag -> rejected */ - command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY - + INVALID_TAG_DESC; + command = AddCommand.COMMAND_WORD + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + + ADDRESS_DESC_AMY + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY + INVALID_TAG_DESC; assertCommandFailure(command, Tag.MESSAGE_TAG_CONSTRAINTS); } diff --git a/src/test/java/systemtests/EditCommandSystemTest.java b/src/test/java/systemtests/EditCommandSystemTest.java index b1d24a405334..d4c012d9a699 100644 --- a/src/test/java/systemtests/EditCommandSystemTest.java +++ b/src/test/java/systemtests/EditCommandSystemTest.java @@ -5,22 +5,38 @@ import static org.junit.Assert.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.BIKE_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.BIKE_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_BIKE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_LOANRATE_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_LOANTIME_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_NRIC_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.LOANRATE_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.LOANRATE_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.LOANTIME_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.LOANTIME_DESC_BOB; 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.TAG_DESC_FRIEND; import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; +import static seedu.address.logic.commands.CommandTestUtil.VALID_BIKE_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANRATE_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_LOANTIME_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NRIC_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -42,7 +58,10 @@ import seedu.address.model.loan.Address; import seedu.address.model.loan.Email; import seedu.address.model.loan.Loan; +import seedu.address.model.loan.LoanRate; +import seedu.address.model.loan.LoanTime; import seedu.address.model.loan.Name; +import seedu.address.model.loan.Nric; import seedu.address.model.loan.Phone; import seedu.address.model.tag.Tag; import seedu.address.testutil.LoanBuilder; @@ -61,7 +80,8 @@ public void edit() { */ Index index = INDEX_FIRST_LOAN; String command = " " + EditCommand.COMMAND_WORD + " " + index.getOneBased() + " " + NAME_DESC_BOB + " " - + PHONE_DESC_BOB + " " + EMAIL_DESC_BOB + " " + ADDRESS_DESC_BOB + " " + TAG_DESC_HUSBAND + " "; + + NRIC_DESC_BOB + " " + PHONE_DESC_BOB + " " + EMAIL_DESC_BOB + " " + ADDRESS_DESC_BOB + " " + + BIKE_DESC_BOB + " " + LOANRATE_DESC_BOB + " " + LOANTIME_DESC_BOB + " " + TAG_DESC_HUSBAND + " "; Loan editedLoan = new LoanBuilder(BOB).withTags(VALID_TAG_HUSBAND).build(); assertCommandSuccess(command, index, editedLoan); @@ -78,26 +98,50 @@ public void edit() { assertCommandSuccess(command, model, expectedResultMessage); /* Case: edit a loan with new values same as existing values -> edited */ - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; assertCommandSuccess(command, index, BOB); /* Case: edit a loan with new values same as another loan's values but with different name -> edited */ assertTrue(getModel().getLoanBook().getLoanList().contains(BOB)); index = INDEX_SECOND_LOAN; assertNotEquals(getModel().getFilteredLoanList().get(index.getZeroBased()), BOB); - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_AMY + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_AMY + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; editedLoan = new LoanBuilder(BOB).withName(VALID_NAME_AMY).build(); assertCommandSuccess(command, index, editedLoan); - /* Case: edit a loan with new values same as another loan's values but with different phone and email - * -> edited - */ + /* Case: edit a loan with new values same as another loan's values but with different nric -> edited */ + index = INDEX_SECOND_LOAN; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_AMY + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + editedLoan = new LoanBuilder(BOB).withNric(VALID_NRIC_AMY).build(); + assertCommandSuccess(command, index, editedLoan); + + /* Case: edit a loan with new values same as another loan's values but with different bike -> edited */ index = INDEX_SECOND_LOAN; - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + PHONE_DESC_AMY + EMAIL_DESC_AMY - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; - editedLoan = new LoanBuilder(BOB).withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).build(); + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_AMY + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + editedLoan = new LoanBuilder(BOB).withBike(VALID_BIKE_AMY).build(); + assertCommandSuccess(command, index, editedLoan); + + /* Case: edit a loan with new values same as another loan's values but with different phone number, email, + loan rate and loan time -> edited */ + index = INDEX_SECOND_LOAN; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_AMY + + EMAIL_DESC_AMY + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + editedLoan = new LoanBuilder(BOB).withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY) + .withLoanRate(VALID_LOANRATE_AMY).withLoanTime(VALID_LOANTIME_AMY).build(); assertCommandSuccess(command, index, editedLoan); /* Case: clear tags -> cleared */ @@ -134,8 +178,10 @@ public void edit() { showAllLoans(); index = INDEX_FIRST_LOAN; selectLoan(index); - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY - + ADDRESS_DESC_AMY + TAG_DESC_FRIEND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_AMY + NRIC_DESC_AMY + PHONE_DESC_AMY + + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + + BIKE_DESC_AMY + LOANRATE_DESC_AMY + LOANTIME_DESC_AMY + + TAG_DESC_FRIEND; // this can be misleading: card selection actually remains unchanged but the // browser's url is updated to reflect the new loan's name assertCommandSuccess(command, index, AMY, index); @@ -167,6 +213,10 @@ public void edit() { assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_NAME_DESC, Name.MESSAGE_NAME_CONSTRAINTS); + /* Case: invalid nric -> rejected */ + assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_NRIC_DESC, + Nric.MESSAGE_NRIC_CONSTRAINTS); + /* Case: invalid phone -> rejected */ assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_PHONE_DESC, Phone.MESSAGE_PHONE_CONSTRAINTS); @@ -179,6 +229,18 @@ public void edit() { assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_ADDRESS_DESC, Address.MESSAGE_ADDRESS_CONSTRAINTS); + /* Case: invalid bike -> rejected */ + assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_BIKE_DESC, + Name.MESSAGE_NAME_CONSTRAINTS); + + /* Case: invalid loan rate -> rejected */ + assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_LOANRATE_DESC, + LoanRate.MESSAGE_LOANRATE_CONSTRAINTS); + + /* Case: invalid loan time -> rejected */ + assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_LOANTIME_DESC, + LoanTime.MESSAGE_LOANTIME_CONSTRAINTS); + /* Case: invalid tag -> rejected */ assertCommandFailure(EditCommand.COMMAND_WORD + " " + INDEX_FIRST_LOAN.getOneBased() + INVALID_TAG_DESC, Tag.MESSAGE_TAG_CONSTRAINTS); @@ -188,28 +250,52 @@ public void edit() { assertTrue(getModel().getLoanBook().getLoanList().contains(BOB)); index = INDEX_FIRST_LOAN; assertFalse(getModel().getFilteredLoanList().get(index.getZeroBased()).equals(BOB)); - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; assertCommandFailure(command, EditCommand.MESSAGE_DUPLICATE_LOAN); /* Case: edit a loan with new values same as another loan's values but with different tags -> rejected */ - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_HUSBAND; assertCommandFailure(command, EditCommand.MESSAGE_DUPLICATE_LOAN); /* Case: edit a loan with new values same as another loan's values but with different address -> rejected */ - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_AMY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_AMY + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; assertCommandFailure(command, EditCommand.MESSAGE_DUPLICATE_LOAN); /* Case: edit a loan with new values same as another loan's values but with different phone -> rejected */ - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + PHONE_DESC_AMY + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_AMY + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; assertCommandFailure(command, EditCommand.MESSAGE_DUPLICATE_LOAN); /* Case: edit a loan with new values same as another loan's values but with different email -> rejected */ - command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_AMY - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_AMY + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + assertCommandFailure(command, EditCommand.MESSAGE_DUPLICATE_LOAN); + + /* Case: edit a loan with new values same as another loan's values but with different loan rate -> rejected */ + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_AMY + LOANTIME_DESC_BOB + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; + assertCommandFailure(command, EditCommand.MESSAGE_DUPLICATE_LOAN); + + /* Case: edit a loan with new values same as another loan's values but with different loan time -> rejected */ + command = EditCommand.COMMAND_WORD + " " + index.getOneBased() + NAME_DESC_BOB + NRIC_DESC_BOB + PHONE_DESC_BOB + + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + BIKE_DESC_BOB + LOANRATE_DESC_BOB + LOANTIME_DESC_AMY + + TAG_DESC_FRIEND + TAG_DESC_HUSBAND; assertCommandFailure(command, EditCommand.MESSAGE_DUPLICATE_LOAN); }