Skip to content

Commit

Permalink
Merge pull request #57 from yooplo/branch-finding-by-email-command
Browse files Browse the repository at this point in the history
Implement FindByEmailCommand Class
  • Loading branch information
CYX22222003 authored Oct 10, 2024
2 parents a48b49b + db4fd07 commit 04e2b8c
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,17 @@
public abstract class AbstractFindCommand extends Command {

public static final String COMMAND_WORD = "find";
public static final String NAME_COMMAND_WORD = "/n";
public static final String EMAIL_COMMAND_WORD = "/e";
public static final String CONTACT_COMMAND_WORD = "/c";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Finds all persons whose names, contacts or emails "
+ "contain any of the specified keywords (case-insensitive) and displays them as a list with indices.\n"
+ "Parameters: KEYWORD [MORE_KEYWORDS]...\n"
+ "Example: " + COMMAND_WORD + " alice bob charlie";
+ "Example:\n"
+ COMMAND_WORD + NAME_COMMAND_WORD + " alice bob charlie\n"
+ COMMAND_WORD + EMAIL_COMMAND_WORD + " [email protected]\n"
+ COMMAND_WORD + CONTACT_COMMAND_WORD + " 12345678\n";

private final ContainsKeywordsPredicate predicate;

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

import seedu.address.model.person.EmailContainsKeywordsPredicate;

/**
* Finds and lists all persons in address book whose email is equivalent to the specified keyword.
* Keyword matching is case-insensitive.
*/
public class FindByEmailCommand extends AbstractFindCommand {

public static final String COMMAND_WORD = "find /e";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Finds all persons whose email "
+ "is the same as the specified keywords (case-insensitive) and displays them as a list with indices.\n"
+ "Parameters: KEYWORD [MORE_KEYWORDS]...\n"
+ "Example: " + COMMAND_WORD + " [email protected]";

public FindByEmailCommand(EmailContainsKeywordsPredicate predicate) {
super(predicate);
}

@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}

// instanceof handles nulls
if (!(other instanceof FindByEmailCommand)) {
return false;
}

FindByEmailCommand otherFindCommand = (FindByEmailCommand) other;
return this.getPredicate().equals(otherFindCommand.getPredicate());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@

import seedu.address.logic.commands.AbstractFindCommand;
import seedu.address.logic.commands.FindByContactCommand;
import seedu.address.logic.commands.FindByEmailCommand;
import seedu.address.logic.commands.FindByNameCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.ContactContainsKeywordsPredicate;
import seedu.address.model.person.EmailContainsKeywordsPredicate;
import seedu.address.model.person.NameContainsKeywordsPredicate;

/**
Expand Down Expand Up @@ -49,6 +51,9 @@ public AbstractFindCommand parse(String args) throws ParseException {
case "/c":
return new FindByContactCommand(
new ContactContainsKeywordsPredicate(Arrays.asList(searchTermArray)));
case "/e":
return new FindByEmailCommand(
new EmailContainsKeywordsPredicate(Arrays.asList(searchTermArray)));
default:
return null; // temporary value, this should not occur due to regex
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
* Contains integration tests (interaction with the Model) for {@code FindByContactCommand}.
*/
public class FindByContactCommandTest {
private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
private Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs());
private final Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs());
private final Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());

@Test
public void equals() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package seedu.address.logic.commands;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static seedu.address.logic.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW;
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;

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

import org.junit.jupiter.api.Test;

import seedu.address.model.Model;
import seedu.address.model.ModelManager;
import seedu.address.model.UserPrefs;
import seedu.address.model.person.EmailContainsKeywordsPredicate;

public class FindByEmailCommandTest {

private final Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs());
private final Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());

@Test
public void equals() {
EmailContainsKeywordsPredicate firstPredicate =
new EmailContainsKeywordsPredicate(Collections.singletonList("first"));
EmailContainsKeywordsPredicate secondPredicate =
new EmailContainsKeywordsPredicate(Collections.singletonList("second"));

FindByEmailCommand findFirstCommand = new FindByEmailCommand(firstPredicate);
FindByEmailCommand findSecondCommand = new FindByEmailCommand(secondPredicate);

// same object -> returns true
assertEquals(findFirstCommand, findFirstCommand);

// same values -> returns true
FindByEmailCommand findFirstCommandCopy = new FindByEmailCommand(firstPredicate);
assertEquals(findFirstCommand, findFirstCommandCopy);

// different types -> returns false
assertNotEquals(1, findFirstCommand);

// null -> returns false
assertNotEquals(null, findFirstCommand);

// different person -> returns false
assertNotEquals(findFirstCommand, findSecondCommand);
}

@Test
public void execute_zeroKeywords_noPersonFound() {
String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0);
EmailContainsKeywordsPredicate predicate = preparePredicate(" ");
FindByEmailCommand command = new FindByEmailCommand(predicate);
expectedModel.updateFilteredPersonList(predicate);
assertCommandSuccess(command, model, expectedMessage, expectedModel);
assertEquals(Collections.emptyList(), model.getFilteredPersonList());
}

@Test
public void toStringMethod() {
EmailContainsKeywordsPredicate predicate = new EmailContainsKeywordsPredicate(Arrays.asList("keyword"));
FindByEmailCommand findCommand = new FindByEmailCommand(predicate);
String expected = FindByEmailCommand.class.getCanonicalName() + "{predicate=" + predicate + "}";
assertEquals(expected, findCommand.toString());
}

/**
* Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}.
*/
private EmailContainsKeywordsPredicate preparePredicate(String userInput) {
return new EmailContainsKeywordsPredicate(Arrays.asList(userInput.split("\\s+")));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@

import seedu.address.logic.commands.AbstractFindCommand;
import seedu.address.logic.commands.FindByContactCommand;
import seedu.address.logic.commands.FindByEmailCommand;
import seedu.address.logic.commands.FindByNameCommand;
import seedu.address.model.person.ContactContainsKeywordsPredicate;
import seedu.address.model.person.EmailContainsKeywordsPredicate;
import seedu.address.model.person.NameContainsKeywordsPredicate;

public class FindCommandParserTest {
Expand Down Expand Up @@ -49,4 +51,17 @@ public void parse_validArgs_returnsFindByContactCommand() {
assertParseSuccess(parser, "/c \n 91234567 \n \t 995 \t", expectedFindCommand);
}

@Test
public void parse_validArgs_returnsFindByEmailCommand() {
FindByEmailCommand expectedFindCommand =
new FindByEmailCommand(new EmailContainsKeywordsPredicate(
Arrays.asList("[email protected]", "[email protected]")));

// no leading and trailing whitespaces
assertParseSuccess(parser, "/e [email protected] [email protected]", expectedFindCommand);

// multiple whitespaces between keywords
assertParseSuccess(parser, "/e \n [email protected] \n \t [email protected] \t", expectedFindCommand);
}

}

0 comments on commit 04e2b8c

Please sign in to comment.