From 98160561f543fa6aa73399a33a8a779883be9ecd Mon Sep 17 00:00:00 2001 From: Grant Date: Thu, 18 Jun 2020 17:00:39 +0000 Subject: [PATCH 1/4] Working on tests --- .../java/com/google/sps/MeetingRequest.java | 6 + .../com/google/sps/FindMeetingQueryTest.java | 144 +++++++++++++++++- 2 files changed, 149 insertions(+), 1 deletion(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java index d690e9f..224fc91 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java @@ -34,6 +34,12 @@ public MeetingRequest(Collection attendees, long duration) { this.duration = duration; this.attendees.addAll(attendees); } + + public MeetingRequest(Collection attendees, Collection optional_attendees, long duration) { + this.attendees.addAll(attendees); + this.optional_attendees.addAll(optional_attendees); + this.duration = duration; + } /** * Returns a read-only copy of the people who are required to attend this meeting. diff --git a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java index 9235153..240f88a 100644 --- a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java +++ b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java @@ -34,15 +34,18 @@ public final class FindMeetingQueryTest { // Some people that we can use in our tests. private static final String PERSON_A = "Person A"; private static final String PERSON_B = "Person B"; + private static final String PERSON_C = "Person C"; // All dates are the first day of the year 2020. private static final int TIME_0800AM = TimeRange.getTimeInMinutes(8, 0); private static final int TIME_0830AM = TimeRange.getTimeInMinutes(8, 30); + private static final int TIME_0845AM = TimeRange.getTimeInMinutes(8, 45); private static final int TIME_0900AM = TimeRange.getTimeInMinutes(9, 0); private static final int TIME_0930AM = TimeRange.getTimeInMinutes(9, 30); private static final int TIME_1000AM = TimeRange.getTimeInMinutes(10, 0); private static final int TIME_1100AM = TimeRange.getTimeInMinutes(11, 00); - + + private static final int DURATION_15_MINUTES = 15; private static final int DURATION_30_MINUTES = 30; private static final int DURATION_60_MINUTES = 60; private static final int DURATION_90_MINUTES = 90; @@ -270,5 +273,144 @@ public void notEnoughRoom() { Assert.assertEquals(expected, actual); } + + @Test + public void optionalAttendeeNotConsidered() { + // Have each person have different events. We should see two options because each person has + // split the restricted times. + // + // Events : |--A--| |--B--| + // |--------------C--------------| + // Day : |-----------------------------| + // Options : |--1--| |--2--| |--3--| + + Collection events = Arrays.asList( + new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), + Arrays.asList(PERSON_A)), + new Event("Event 2", TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES), + Arrays.asList(PERSON_B)), + new Event("Event 3", TimeRange.fromStartDuration(TimeRange.START_OF_DAY, TimeRange.END_OF_DAY), + Arrays.asList(PERSON_C))); + + + MeetingRequest request = + new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), Arrays.asList(PERSON_C), DURATION_30_MINUTES); + + Collection actual = query.query(events, request); + Collection expected = + Arrays.asList(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), + TimeRange.fromStartEnd(TIME_0830AM, TIME_0900AM, false), + TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); + + Assert.assertEquals(expected, actual); + } + + @Test + public void considerOptionalAttendee() { + // Have each person have different events. We should see two options because each person has + // split the restricted times. + // + // Events : |--A--|--c--|--B--| + // Day : |-----------------------------| + // Options : |--1--| |--3--| + + Collection events = Arrays.asList( + new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), + Arrays.asList(PERSON_A)), + new Event("Event 2", TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES), + Arrays.asList(PERSON_B)), + new Event("Event 3", TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES), + Arrays.asList(PERSON_C))); + + + MeetingRequest request = + new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), Arrays.asList(PERSON_C), DURATION_30_MINUTES); + + Collection actual = query.query(events, request); + Collection expected = + Arrays.asList(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), + TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); + + Assert.assertEquals(expected, actual); + } + + @Test + public void noRoomForOptionalAttendee() { + // Have one person, but make it so that there is just enough room at one point in the day to + // have the meeting. + // + // Events : |--A--| |----A----| + // |-B-| + // Day : |---------------------| + // Options : |-----| + + Collection events = Arrays.asList( + new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0830AM, false), + Arrays.asList(PERSON_A)), + new Event("Event 2", TimeRange.fromStartEnd(TIME_0900AM, TimeRange.END_OF_DAY, true), + Arrays.asList(PERSON_A)), + new Event("Event 3", TimeRange.fromStartEnd(TIME_0830AM, TIME_0845AM, false), + Arrays.asList(PERSON_B))); + + MeetingRequest request = new MeetingRequest(Arrays.asList(), Arrays.asList(PERSON_A, PERSON_B), DURATION_30_MINUTES); + + Collection actual = query.query(events, request); + Collection expected = + Arrays.asList(TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES)); + + Assert.assertEquals(expected, actual); + } + + @Test + public void noMandatoryAttendeesWithGaps() { + // Have one person, but make it so that there is just enough room at one point in the day to + // have the meeting. + // + // Events : |--A--| |--B--| |----B----| + // Day : |----------------------------------| + // Options : |--BO-|-ABO|--AO--|--ABO-|----AO---| + + Collection events = Arrays.asList( + new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0830AM, false), + Arrays.asList(PERSON_A)), + new Event("Event 2", TimeRange.fromStartEnd(TIME_0900AM, TIME_0930AM, true), + Arrays.asList(PERSON_B)), + new Event("Event 3", TimeRange.fromStartEnd(TIME_1100AM, TimeRange.END_OF_DAY, false), + Arrays.asList(PERSON_B))); + + MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_A), Arrays.asList(PERSON_B), DURATION_30_MINUTES); + + Collection actual = query.query(events, request); + Collection expected = + Arrays.asList(TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES), + TimeRange.fromStartDuration(TIME_0930AM, TIME_1100AM)); + + Assert.assertEquals(expected, actual); + } + + @Test + public void noMandatoryAttendeesWithNoGaps() { + // Have one person, but make it so that there is just enough room at one point in the day to + // have the meeting. + // + // Events : |--A--|--B--|--A--|--B--|--A--|--B--| + // Day : |-----------------------------------| + // Options : + + Collection events = Arrays.asList( + new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TimeRange.END_OF_DAY, false), + Arrays.asList(PERSON_A)), + new Event("Event 2", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TimeRange.END_OF_DAY, false), + Arrays.asList(PERSON_B))); + + MeetingRequest request = new MeetingRequest(Arrays.asList(), Arrays.asList(PERSON_A, PERSON_B), DURATION_30_MINUTES); + + Collection actual = query.query(events, request); + Collection expected = Arrays.asList(); + + Assert.assertEquals(expected, actual); + } + + } From ac253243a3e625d697b848035ebde0874f7eb1d2 Mon Sep 17 00:00:00 2001 From: Grant Date: Fri, 19 Jun 2020 01:11:53 +0000 Subject: [PATCH 2/4] Fails 2 tests --- .../java/com/google/sps/FindMeetingQuery.java | 44 +++++--- .../java/com/google/sps/MeetingRequest.java | 6 -- .../com/google/sps/FindMeetingQueryTest.java | 102 ++++++------------ .../com/google/sps/MeetingRequestTest.java | 4 +- 4 files changed, 69 insertions(+), 87 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index c8e4c4f..cbade24 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -28,28 +28,47 @@ public final class FindMeetingQuery { public int compare(Event a, Event b) { return Long.compare(a.getWhen().start(), b.getWhen().start()); }}; - - public Collection query(Collection eventCollection, MeetingRequest request) { + + public Collection query(Collection eventCollection, MeetingRequest request) { + Collection attendees = new ArrayList(); + if (!request.getOptionalAttendees().isEmpty()) { + attendees.addAll(request.getOptionalAttendees()); + if (!request.getAttendees().isEmpty()) { + attendees.addAll(request.getAttendees()); + } + return queryHelper(eventCollection, request, attendees); + } + if(!request.getAttendees().isEmpty()) { + attendees.addAll(request.getAttendees()); + if (!request.getAttendees().isEmpty()) { + attendees.addAll(request.getAttendees()); + } + return queryHelper(eventCollection, request, attendees); + } + return queryHelper(eventCollection, request, attendees); + } + + private static Collection queryHelper(Collection groupOfEvents, MeetingRequest request, Collection attendees) { // Too long of a request if (request.getDuration() > TimeRange.WHOLE_DAY.duration()) { return Collections.emptyList(); } - // No events or attendees - List events = new ArrayList(eventCollection); - List meetingAttendees = new ArrayList(request.getAttendees()); - if (events.isEmpty() || meetingAttendees.isEmpty()) { + // No events + List events = new ArrayList(groupOfEvents); + if (events.isEmpty()) { return Arrays.asList(TimeRange.WHOLE_DAY); } + // Ignores unattended events List importantEvents = new ArrayList(); for (Event event : events) { - if (!Collections.disjoint(event.getAttendees(), request.getAttendees())) { + if (!Collections.disjoint(event.getAttendees(), attendees)) { importantEvents.add(event); } } - + // If the list of important events is empty, return the whole day if (importantEvents.isEmpty()) { return Arrays.asList(TimeRange.WHOLE_DAY); @@ -62,7 +81,7 @@ public Collection query(Collection eventCollection, MeetingReq List acceptableMeetingTimes = new ArrayList(); // Add the event that starts first - acceptableMeetingTimes.add(TimeRange.fromStartEnd(0, importantEvents.get(0).getWhen().start(), false)); + acceptableMeetingTimes.add(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, importantEvents.get(0).getWhen().start(), false)); // Set the end time and start time as the end of the first event int latestEventEnd = importantEvents.get(0).getWhen().end(); @@ -72,7 +91,7 @@ public Collection query(Collection eventCollection, MeetingReq for (Event event : importantEvents) { start = event.getWhen().start(); - if (start > latestEventEnd) { + if (start >= latestEventEnd) { if (rangeLessThanDuration(TimeRange.fromStartEnd(latestEventEnd, start, false), request.getDuration())) { acceptableMeetingTimes.add(TimeRange.fromStartEnd(latestEventEnd, start, false)); latestEventEnd = event.getWhen().end(); @@ -80,7 +99,7 @@ public Collection query(Collection eventCollection, MeetingReq latestEventEnd = event.getWhen().end(); } - if (start < latestEventEnd) { + if (start <= latestEventEnd) { if (latestEventEnd < event.getWhen().end()) { latestEventEnd = event.getWhen().end(); if (rangeLessThanDuration(TimeRange.fromStartEnd(latestEventEnd, start, false), request.getDuration())) { @@ -110,11 +129,12 @@ public Collection query(Collection eventCollection, MeetingReq } } - return acceptableMeetingTimes; + return acceptableMeetingTimes; } // Check if the meeting duration fits within a given time range private static boolean rangeLessThanDuration(TimeRange range, long meetingDuration) { return (range.duration() >= meetingDuration); } + } diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java index 224fc91..d690e9f 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/MeetingRequest.java @@ -34,12 +34,6 @@ public MeetingRequest(Collection attendees, long duration) { this.duration = duration; this.attendees.addAll(attendees); } - - public MeetingRequest(Collection attendees, Collection optional_attendees, long duration) { - this.attendees.addAll(attendees); - this.optional_attendees.addAll(optional_attendees); - this.duration = duration; - } /** * Returns a read-only copy of the people who are required to attend this meeting. diff --git a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java index 240f88a..904ed28 100644 --- a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java +++ b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java @@ -212,16 +212,16 @@ public void justEnoughRoom() { // Options : |-----| Collection events = Arrays.asList( - new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0830AM, false), + new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0900AM, false), Arrays.asList(PERSON_A)), - new Event("Event 2", TimeRange.fromStartEnd(TIME_0900AM, TimeRange.END_OF_DAY, true), + new Event("Event 2", TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true), Arrays.asList(PERSON_A))); MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_A), DURATION_30_MINUTES); Collection actual = query.query(events, request); Collection expected = - Arrays.asList(TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES)); + Arrays.asList(TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES)); Assert.assertEquals(expected, actual); } @@ -275,60 +275,45 @@ public void notEnoughRoom() { } @Test - public void optionalAttendeeNotConsidered() { - // Have each person have different events. We should see two options because each person has - // split the restricted times. - // - // Events : |--A--| |--B--| - // |--------------C--------------| - // Day : |-----------------------------| - // Options : |--1--| |--2--| |--3--| - + public void OptionalAttendeeConsidered() { Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), Arrays.asList(PERSON_A)), new Event("Event 2", TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES), Arrays.asList(PERSON_B)), - new Event("Event 3", TimeRange.fromStartDuration(TimeRange.START_OF_DAY, TimeRange.END_OF_DAY), + new Event("Event 3", TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES), Arrays.asList(PERSON_C))); - MeetingRequest request = - new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), Arrays.asList(PERSON_C), DURATION_30_MINUTES); + new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), DURATION_30_MINUTES); + request.addOptionalAttendee(PERSON_C); Collection actual = query.query(events, request); Collection expected = Arrays.asList(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), - TimeRange.fromStartEnd(TIME_0830AM, TIME_0900AM, false), TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); Assert.assertEquals(expected, actual); } @Test - public void considerOptionalAttendee() { - // Have each person have different events. We should see two options because each person has - // split the restricted times. - // - // Events : |--A--|--c--|--B--| - // Day : |-----------------------------| - // Options : |--1--| |--3--| - + public void optionalAttendeeNotConsidered() { Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), Arrays.asList(PERSON_A)), new Event("Event 2", TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES), Arrays.asList(PERSON_B)), - new Event("Event 3", TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES), - Arrays.asList(PERSON_C))); + new Event("Event 3",TimeRange.WHOLE_DAY, Arrays.asList(PERSON_C))); MeetingRequest request = - new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), Arrays.asList(PERSON_C), DURATION_30_MINUTES); - + new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), DURATION_30_MINUTES); + request.addOptionalAttendee(PERSON_C); + Collection actual = query.query(events, request); Collection expected = Arrays.asList(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), + TimeRange.fromStartEnd(TIME_0830AM, TIME_0900AM, false), TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); Assert.assertEquals(expected, actual); @@ -336,23 +321,16 @@ public void considerOptionalAttendee() { @Test public void noRoomForOptionalAttendee() { - // Have one person, but make it so that there is just enough room at one point in the day to - // have the meeting. - // - // Events : |--A--| |----A----| - // |-B-| - // Day : |---------------------| - // Options : |-----| - Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0830AM, false), Arrays.asList(PERSON_A)), new Event("Event 2", TimeRange.fromStartEnd(TIME_0900AM, TimeRange.END_OF_DAY, true), Arrays.asList(PERSON_A)), - new Event("Event 3", TimeRange.fromStartEnd(TIME_0830AM, TIME_0845AM, false), + new Event("Event 3", TimeRange.fromStartEnd(TIME_0830AM, TIME_0845AM, true), Arrays.asList(PERSON_B))); - MeetingRequest request = new MeetingRequest(Arrays.asList(), Arrays.asList(PERSON_A, PERSON_B), DURATION_30_MINUTES); + MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_A), DURATION_30_MINUTES); + request.addOptionalAttendee(PERSON_B); Collection actual = query.query(events, request); Collection expected = @@ -362,48 +340,38 @@ public void noRoomForOptionalAttendee() { } @Test - public void noMandatoryAttendeesWithGaps() { - // Have one person, but make it so that there is just enough room at one point in the day to - // have the meeting. - // - // Events : |--A--| |--B--| |----B----| - // Day : |----------------------------------| - // Options : |--BO-|-ABO|--AO--|--ABO-|----AO---| - + public void twoOptionalAttendeesWithGaps() { Collection events = Arrays.asList( - new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0830AM, false), - Arrays.asList(PERSON_A)), - new Event("Event 2", TimeRange.fromStartEnd(TIME_0900AM, TIME_0930AM, true), - Arrays.asList(PERSON_B)), - new Event("Event 3", TimeRange.fromStartEnd(TIME_1100AM, TimeRange.END_OF_DAY, false), - Arrays.asList(PERSON_B))); + new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), + Arrays.asList(PERSON_A)), + new Event("Event 2", TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES), + Arrays.asList(PERSON_B))); - MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_A), Arrays.asList(PERSON_B), DURATION_30_MINUTES); + MeetingRequest request = new MeetingRequest(Arrays.asList(), DURATION_30_MINUTES); + request.addOptionalAttendee(PERSON_A); + request.addOptionalAttendee(PERSON_B); Collection actual = query.query(events, request); - Collection expected = - Arrays.asList(TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES), - TimeRange.fromStartDuration(TIME_0930AM, TIME_1100AM)); + Collection expected = Arrays.asList( + TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), + TimeRange.fromStartEnd(TIME_0830AM, TIME_0900AM, false), + TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); Assert.assertEquals(expected, actual); } @Test - public void noMandatoryAttendeesWithNoGaps() { - // Have one person, but make it so that there is just enough room at one point in the day to - // have the meeting. - // - // Events : |--A--|--B--|--A--|--B--|--A--|--B--| - // Day : |-----------------------------------| - // Options : - + public void twoOptionalAttendeesWithNoGaps() { + // Only two optional attendees and no gaps during the day Collection events = Arrays.asList( - new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TimeRange.END_OF_DAY, false), + new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0830AM, false), Arrays.asList(PERSON_A)), - new Event("Event 2", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TimeRange.END_OF_DAY, false), + new Event("Event 2", TimeRange.fromStartEnd(TIME_0900AM, TimeRange.END_OF_DAY, true), Arrays.asList(PERSON_B))); - MeetingRequest request = new MeetingRequest(Arrays.asList(), Arrays.asList(PERSON_A, PERSON_B), DURATION_30_MINUTES); + MeetingRequest request = new MeetingRequest(Arrays.asList(), DURATION_60_MINUTES); + request.addOptionalAttendee(PERSON_A); + request.addOptionalAttendee(PERSON_B); Collection actual = query.query(events, request); Collection expected = Arrays.asList(); diff --git a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/MeetingRequestTest.java b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/MeetingRequestTest.java index 757ae68..bc2a8f3 100644 --- a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/MeetingRequestTest.java +++ b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/MeetingRequestTest.java @@ -37,8 +37,8 @@ public final class MeetingRequestTest { @Test public void CantAddOptionalAttendeeWhoIsAlsoMandatory() { - MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_A), DURATION_1_HOUR); - request.addOptionalAttendee(PERSON_A); + MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_C), DURATION_1_HOUR); + request.addOptionalAttendee(PERSON_C); int actual = request.getOptionalAttendees().size(); int expected = 0; From 0fc7df66120a43a21baa4d5b2f89cf1024dc7ff5 Mon Sep 17 00:00:00 2001 From: Grant Date: Fri, 19 Jun 2020 04:29:52 +0000 Subject: [PATCH 3/4] Passes all tests --- .../java/com/google/sps/FindMeetingQuery.java | 22 +++++++------- .../com/google/sps/FindMeetingQueryTest.java | 29 ++++++++++--------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index cbade24..8ef5cbd 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -31,20 +31,18 @@ public int compare(Event a, Event b) { public Collection query(Collection eventCollection, MeetingRequest request) { Collection attendees = new ArrayList(); - if (!request.getOptionalAttendees().isEmpty()) { - attendees.addAll(request.getOptionalAttendees()); - if (!request.getAttendees().isEmpty()) { - attendees.addAll(request.getAttendees()); - } - return queryHelper(eventCollection, request, attendees); + attendees.addAll(request.getOptionalAttendees()); + attendees.addAll(request.getAttendees()); + if (request.getOptionalAttendees().isEmpty()) { + attendees.removeAll(request.getOptionalAttendees()); } - if(!request.getAttendees().isEmpty()) { - attendees.addAll(request.getAttendees()); - if (!request.getAttendees().isEmpty()) { - attendees.addAll(request.getAttendees()); - } + if (request.getAttendees().isEmpty()) { + attendees.removeAll(request.getAttendees()); + } + if (queryHelper(eventCollection, request, attendees).isEmpty()) { + attendees.removeAll(request.getOptionalAttendees()); return queryHelper(eventCollection, request, attendees); - } + } return queryHelper(eventCollection, request, attendees); } diff --git a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java index 904ed28..fe7dbc0 100644 --- a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java +++ b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java @@ -43,7 +43,9 @@ public final class FindMeetingQueryTest { private static final int TIME_0900AM = TimeRange.getTimeInMinutes(9, 0); private static final int TIME_0930AM = TimeRange.getTimeInMinutes(9, 30); private static final int TIME_1000AM = TimeRange.getTimeInMinutes(10, 0); + private static final int TIME_1030AM = TimeRange.getTimeInMinutes(10, 30); private static final int TIME_1100AM = TimeRange.getTimeInMinutes(11, 00); + private static final int TIME_1130AM = TimeRange.getTimeInMinutes(11, 30); private static final int DURATION_15_MINUTES = 15; private static final int DURATION_30_MINUTES = 30; @@ -277,11 +279,11 @@ public void notEnoughRoom() { @Test public void OptionalAttendeeConsidered() { Collection events = Arrays.asList( - new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), + new Event("Event 1", TimeRange.fromStartDuration(TIME_1000AM, DURATION_30_MINUTES), Arrays.asList(PERSON_A)), - new Event("Event 2", TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES), + new Event("Event 2", TimeRange.fromStartDuration(TIME_1100AM, DURATION_30_MINUTES), Arrays.asList(PERSON_B)), - new Event("Event 3", TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES), + new Event("Event 3", TimeRange.fromStartDuration(TIME_1030AM, DURATION_30_MINUTES), Arrays.asList(PERSON_C))); MeetingRequest request = @@ -289,15 +291,16 @@ public void OptionalAttendeeConsidered() { request.addOptionalAttendee(PERSON_C); Collection actual = query.query(events, request); - Collection expected = - Arrays.asList(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), - TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); + Collection expected = Arrays.asList( + TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_1000AM, false), + TimeRange.fromStartEnd(TIME_1130AM, TimeRange.END_OF_DAY, true)); Assert.assertEquals(expected, actual); } @Test public void optionalAttendeeNotConsidered() { + // Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), Arrays.asList(PERSON_A)), @@ -311,10 +314,10 @@ public void optionalAttendeeNotConsidered() { request.addOptionalAttendee(PERSON_C); Collection actual = query.query(events, request); - Collection expected = - Arrays.asList(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), - TimeRange.fromStartEnd(TIME_0830AM, TIME_0900AM, false), - TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); + Collection expected = Arrays.asList( + TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0800AM, false), + TimeRange.fromStartEnd(TIME_0830AM, TIME_0900AM, false), + TimeRange.fromStartEnd(TIME_0930AM, TimeRange.END_OF_DAY, true)); Assert.assertEquals(expected, actual); } @@ -333,8 +336,8 @@ public void noRoomForOptionalAttendee() { request.addOptionalAttendee(PERSON_B); Collection actual = query.query(events, request); - Collection expected = - Arrays.asList(TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES)); + Collection expected = Arrays.asList( + TimeRange.fromStartDuration(TIME_0830AM, DURATION_30_MINUTES)); Assert.assertEquals(expected, actual); } @@ -369,7 +372,7 @@ public void twoOptionalAttendeesWithNoGaps() { new Event("Event 2", TimeRange.fromStartEnd(TIME_0900AM, TimeRange.END_OF_DAY, true), Arrays.asList(PERSON_B))); - MeetingRequest request = new MeetingRequest(Arrays.asList(), DURATION_60_MINUTES); + MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), DURATION_60_MINUTES); request.addOptionalAttendee(PERSON_A); request.addOptionalAttendee(PERSON_B); From cb5d560d8358af51740d59595207cff7bba46619 Mon Sep 17 00:00:00 2001 From: Grant Date: Fri, 19 Jun 2020 13:39:06 +0000 Subject: [PATCH 4/4] Minor fixes --- .../com/google/sps/FindMeetingQueryTest.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java index fe7dbc0..8ae83fe 100644 --- a/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java +++ b/walkthroughs/week-5-tdd/project/src/test/java/com/google/sps/FindMeetingQueryTest.java @@ -277,7 +277,8 @@ public void notEnoughRoom() { } @Test - public void OptionalAttendeeConsidered() { + public void optionalAttendeeConsidered() { + // The optional attendee has gaps that allow a meeting with the required attendees Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartDuration(TIME_1000AM, DURATION_30_MINUTES), Arrays.asList(PERSON_A)), @@ -293,22 +294,21 @@ public void OptionalAttendeeConsidered() { Collection actual = query.query(events, request); Collection expected = Arrays.asList( TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_1000AM, false), - TimeRange.fromStartEnd(TIME_1130AM, TimeRange.END_OF_DAY, true)); + TimeRange.fromStartEnd(TIME_1130cAM, TimeRange.END_OF_DAY, true)); Assert.assertEquals(expected, actual); } @Test public void optionalAttendeeNotConsidered() { - // + // Optional attendee has no time to meet and is therefore not considered Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), Arrays.asList(PERSON_A)), new Event("Event 2", TimeRange.fromStartDuration(TIME_0900AM, DURATION_30_MINUTES), Arrays.asList(PERSON_B)), new Event("Event 3",TimeRange.WHOLE_DAY, Arrays.asList(PERSON_C))); - - + MeetingRequest request = new MeetingRequest(Arrays.asList(PERSON_A, PERSON_B), DURATION_30_MINUTES); request.addOptionalAttendee(PERSON_C); @@ -324,6 +324,8 @@ public void optionalAttendeeNotConsidered() { @Test public void noRoomForOptionalAttendee() { + // Optional Attendee has a meeting that results in the time slot available + // for attendees being too small Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TIME_0830AM, false), Arrays.asList(PERSON_A)), @@ -344,6 +346,7 @@ public void noRoomForOptionalAttendee() { @Test public void twoOptionalAttendeesWithGaps() { + // Only two optional attendees are considered who have gaps in their schedule Collection events = Arrays.asList( new Event("Event 1", TimeRange.fromStartDuration(TIME_0800AM, DURATION_30_MINUTES), Arrays.asList(PERSON_A)), @@ -381,7 +384,5 @@ public void twoOptionalAttendeesWithNoGaps() { Assert.assertEquals(expected, actual); } - - + } -