Skip to content

Commit 4c51945

Browse files
committed
Add Changes and Predicate
Some minor leftovers from AddressBook have to be cleared. Following the Delete Person tests carefully, some classes should be introduced like Predicate classes for checking keywords in meeting names. Some meeting test util functions are also ported over to be able to aid in testing meetings. Lets -Add an extension to Predicate, to check for certain keywords in meeting names.
1 parent 78230c4 commit 4c51945

8 files changed

Lines changed: 104 additions & 24 deletions

File tree

src/main/java/seedu/address/commons/core/Messages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ public class Messages {
99
public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s";
1010
public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX = "The person index provided is invalid";
1111
public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
12+
public static final String MESSAGE_INVALID_MEETING_DISPLAYED_INDEX = "The person index provided is invalid";
13+
1214

1315
}

src/main/java/seedu/address/logic/commands/meetings/DeleteMeetingCommand.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import seedu.address.logic.commands.Command;
66
import seedu.address.logic.commands.CommandResult;
77
import seedu.address.logic.commands.exceptions.CommandException;
8-
import seedu.address.logic.commands.persons.DeletePersonCommand;
98
import seedu.address.model.Model;
109
import seedu.address.model.meeting.Meeting;
1110

@@ -21,7 +20,7 @@ public class DeleteMeetingCommand extends Command {
2120
+ "Parameters: INDEX (must be a positive integer)\n"
2221
+ "Example: " + COMMAND_WORD + " 1";
2322

24-
public static final String MESSAGE_DELETE_PERSON_SUCCESS = "Deleted Meeting: %1$s";
23+
public static final String MESSAGE_DELETE_MEETING_SUCCESS = "Deleted Meeting: %1$s";
2524

2625

2726
private final Index targetIndex;
@@ -36,12 +35,12 @@ public CommandResult execute(Model model) throws CommandException {
3635
List<Meeting> lastShownList = model.getFilteredMeetingList();
3736

3837
if (targetIndex.getZeroBased() >= lastShownList.size()) {
39-
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
38+
throw new CommandException(Messages.MESSAGE_INVALID_MEETING_DISPLAYED_INDEX);
4039
}
4140

4241
Meeting meetingToDelete = lastShownList.get(targetIndex.getZeroBased());
4342
model.deleteMeeting(meetingToDelete);
44-
return new CommandResult(String.format(MESSAGE_DELETE_PERSON_SUCCESS, meetingToDelete));
43+
return new CommandResult(String.format(MESSAGE_DELETE_MEETING_SUCCESS, meetingToDelete));
4544
}
4645

4746
@Override

src/main/java/seedu/address/model/Model.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public interface Model {
9898
*/
9999
void setMeetingBook(ReadOnlyMeetingBook meetingBook);
100100

101-
/** Returns the AddressBook */
101+
/** Returns the Book */
102102
ReadOnlyMeetingBook getMeetingBook();
103103

104104
/**

src/main/java/seedu/address/model/ModelManager.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,42 @@ public class ModelManager implements Model {
2929
private final FilteredList<Person> filteredPersons;
3030

3131
// TODO: Modify the signature of ModelManager so that we can add meetings inside it.
32-
private final MeetingBook meetingBook = new MeetingBook();
33-
private final FilteredList<Meeting> filteredMeetings = new FilteredList<Meeting>(this.meetingBook.getMeetingList());
34-
32+
private final MeetingBook meetingBook;
33+
private final FilteredList<Meeting> filteredMeetings;
3534
/**
36-
* Initializes a ModelManager with the given addressBook and userPrefs.
35+
* Initializes a ModelManager with the given addressBook and userPrefs. MeetingBook will be set to default.
3736
*/
3837
public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) {
3938
super();
4039
requireAllNonNull(addressBook, userPrefs);
4140

4241
logger.fine("Initializing with address book: " + addressBook + " and user prefs " + userPrefs);
4342

43+
this.meetingBook = new MeetingBook();
44+
this.filteredMeetings = new FilteredList<Meeting>(this.meetingBook.getMeetingList());
45+
this.addressBook = new AddressBook(addressBook);
46+
this.userPrefs = new UserPrefs(userPrefs);
47+
filteredPersons = new FilteredList<>(this.addressBook.getPersonList());
48+
}
49+
50+
/**
51+
* Initializes a ModelManager with the given addressBook, meetingBOok and userPrefs
52+
*/
53+
public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyMeetingBook meetingBook,
54+
ReadOnlyUserPrefs userPrefs) {
55+
super();
56+
requireAllNonNull(addressBook, userPrefs);
57+
58+
logger.fine("Initializing with address book: " + addressBook + " and user prefs " + userPrefs);
59+
60+
this.meetingBook = new MeetingBook(meetingBook);
61+
this.filteredMeetings = new FilteredList<Meeting>(this.meetingBook.getMeetingList());
4462
this.addressBook = new AddressBook(addressBook);
4563
this.userPrefs = new UserPrefs(userPrefs);
4664
filteredPersons = new FilteredList<>(this.addressBook.getPersonList());
4765
}
4866

67+
4968
public ModelManager() {
5069
this(new AddressBook(), new UserPrefs());
5170
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package seedu.address.model.meeting;
2+
3+
4+
import java.util.List;
5+
import java.util.function.Predicate;
6+
7+
import seedu.address.commons.util.StringUtil;
8+
9+
/**
10+
* Tests that a {@code Meeting}'s {@code MeetingName} matches any of the keywords given.
11+
*/
12+
public class NameContainsKeywordsPredicate implements Predicate<Meeting> {
13+
private final List<String> keywords;
14+
15+
public NameContainsKeywordsPredicate(List<String> keywords) {
16+
this.keywords = keywords;
17+
}
18+
19+
@Override
20+
public boolean test(Meeting meeting) {
21+
return keywords.stream()
22+
.anyMatch(keyword -> StringUtil.containsWordIgnoreCase(meeting.getName().fullName, keyword));
23+
}
24+
25+
26+
@Override
27+
//TODO: Do we have to include full path name to disntinguish from other NamePredicate? Feels redundant.
28+
public boolean equals(Object other) {
29+
return other == this // short circuit if same object
30+
|| (other instanceof NameContainsKeywordsPredicate // instanceof handles
31+
// nulls
32+
&& keywords.equals(((NameContainsKeywordsPredicate) other).keywords));
33+
// state check
34+
}
35+
36+
}

src/test/java/seedu/address/logic/commands/meetings/MeetingCommandTestUtil.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package seedu.address.logic.commands.meetings;
22

3+
import seedu.address.commons.core.index.Index;
4+
import seedu.address.model.Model;
5+
import seedu.address.model.meeting.Meeting;
6+
import seedu.address.model.meeting.NameContainsKeywordsPredicate;
7+
8+
import java.util.Arrays;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertTrue;
312
import static seedu.address.logic.parser.CliSyntax.PREFIX_DESCRIPTION;
413
import static seedu.address.logic.parser.CliSyntax.PREFIX_END_TIME;
514
import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;
@@ -13,15 +22,15 @@
1322
*/
1423
public class MeetingCommandTestUtil {
1524

16-
public static final String VALID_NAME_MEETING1 = "CS2103 Conference";
25+
public static final String VALID_NAME_MEETING1 = "JCP Conference";
1726
public static final String VALID_NAME_MEETING2 = "NUS Seminar";
1827
public static final String VALID_START_MEETING1 = "2021-01-01 19:00";
1928
public static final String VALID_START_MEETING2 = "2021-03-15 17:00";
2029
public static final String VALID_TERMINATE_MEETING1 = "2021-01-01 20:00";
2130
public static final String VALID_TERMINATE_MEETING2 = "2021-03-15 18:00";
2231
public static final String VALID_PRIORITY_MEETING1 = "2";
2332
public static final String VALID_PRIORITY_MEETING2 = "5";
24-
public static final String VALID_DESCRIPTION_MEETING1 = "CS2103 Conference Test";
33+
public static final String VALID_DESCRIPTION_MEETING1 = "JCP Conference Test";
2534
public static final String VALID_DESCRIPTION_MEETING2 = "NUS Seminar Test";
2635
public static final String VALID_TAG_MEETING1 = "SoC";
2736
public static final String VALID_TAG_MEETING2 = "University";
@@ -46,7 +55,7 @@ public class MeetingCommandTestUtil {
4655
public static final String INVALID_DATETIME_DESC = " " + PREFIX_START_TIME + "2020/02/03 09:00";
4756
public static final String INVALID_PRIORITY_DESC = " " + PREFIX_PRIORITY + "-2";
4857
public static final String INVALID_TAG_DESC = " " + PREFIX_GROUP + "hubby*"; // '*' not allowed in tags
49-
}
58+
5059

5160
//
5261
// public static final String PREAMBLE_WHITESPACE = "\t \r \n";
@@ -106,16 +115,18 @@ public class MeetingCommandTestUtil {
106115
// assertEquals(expectedAddressBook, actualModel.getAddressBook());
107116
// assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());
108117
// }
109-
// /**
110-
// * Updates {@code model}'s filtered list to show only the person at the given {@code targetIndex} in the
111-
// * {@code model}'s address book.
112-
// */
113-
// public static void showPersonAtIndex(Model model, Index targetIndex) {
114-
// assertTrue(targetIndex.getZeroBased() < model.getFilteredPersonList().size());
115-
//
116-
// Person person = model.getFilteredPersonList().get(targetIndex.getZeroBased());
117-
// final String[] splitName = person.getName().fullName.split("\\s+");
118-
// model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));
119-
//
120-
// assertEquals(1, model.getFilteredPersonList().size());//}
118+
/**
119+
* Updates {@code model}'s filtered meetings list to show only the meeting at the given {@code targetIndex} in the
120+
* {@code model}'s meeting book. It is mandatory for this case meeting names are unique with respect to their first
121+
* word in their name.
122+
*/
123+
public static void showMeetingAtIndex(Model model, Index targetIndex) {
124+
assertTrue(targetIndex.getZeroBased() < model.getFilteredMeetingList().size());
125+
126+
Meeting meeting = model.getFilteredMeetingList().get(targetIndex.getZeroBased());
127+
final String[] splitName = meeting.getName().fullName.split("\\s+");
128+
model.updateFilteredMeetingList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));
129+
assertEquals(1, model.getFilteredMeetingList().size());
130+
}
131+
}
121132

src/test/java/seedu/address/logic/commands/persons/DeletePersonCommandTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,6 @@ private void showNoPerson(Model model) {
106106

107107
assertTrue(model.getFilteredPersonList().isEmpty());
108108
}
109+
110+
109111
}

src/test/java/seedu/address/testutil/TypicalMeetings.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import java.util.List;
1919

2020
import seedu.address.model.meeting.Meeting;
21+
import seedu.address.model.meeting.MeetingBook;
22+
import seedu.address.model.person.AddressBook;
23+
import seedu.address.model.person.Person;
2124

2225
/**
2326
* A utility class containing a list of {@code Person} objects to be used in tests.
@@ -65,6 +68,14 @@ public class TypicalMeetings {
6568
// return ab;
6669
// }
6770

71+
public static MeetingBook getTypicalMeetingBook() {
72+
MeetingBook mb = new MeetingBook();
73+
for (Meeting meeting : getTypicalMeetings()) {
74+
mb.addMeeting(meeting);
75+
}
76+
return mb;
77+
}
78+
6879
public static List<Meeting> getTypicalMeetings() {
6980
return new ArrayList<>(Arrays.asList(MEETING1, MEETING2, MEETING3, MEETING4, MEETING5));
7081
}

0 commit comments

Comments
 (0)