public void DuplicateMeetingsReturnsError() { var duplicatedDate = DateTime.Now; _meetings.Add(new Meeting(duplicatedDate, 3, 1)); _meetings.Add(new Meeting(duplicatedDate, 3, 2)); var expectedError = new OverlappedMeetingError(duplicatedDate); var result = _validationService.ValidateNoOverlappedMeetings(_meetings); Assert.Equal(expectedError.Code, result.Code); Assert.Equal(expectedError.Message, result.Message); }
public void OverlappedMeetingReturnsError() { var duplicatedDate = DateTime.Now.AddDays(1); var overlappingMeeting = new Meeting(duplicatedDate.AddHours(1), 3, 2); _meetings.Add(overlappingMeeting); _meetings.Add(new Meeting(duplicatedDate, 3, 1)); var expectedError = new OverlappedMeetingError(overlappingMeeting.Date); var result = _validationService.ValidateNoOverlappedMeetings(_meetings); Assert.Equal(expectedError.Code, result.Code); Assert.Equal(expectedError.Message, result.Message); }
public IResult ValidateNoOverlappedMeetings(IList <Meeting> meetings) { //grouping the meetings by date. var query = meetings.GroupBy(m => m.Date.Date); //going throw all grouped dates. foreach (var date in query) { //getting all meetings for certain date and order them by time. var dateMeetings = meetings.Where(d => d.Date.Date == date.Key).OrderBy(p => p.Date).ToList(); //setting the next available time based on the end time of the first meeting of the day. var nextAvailableTime = dateMeetings.First().End; int meetingCounter = 1; //going throw all meetings for the day. foreach (var meeting in dateMeetings) { //Skipping the first meeting of the day. if (meetingCounter > 1) { if (meeting.Date < nextAvailableTime) { var error = new OverlappedMeetingError(meeting.Date); _errorResolver.Resolve(error); return(error); } //Set the end of the current meeting as a value for the next available time. else { nextAvailableTime = meeting.End; } } meetingCounter++; } } return(new SuccessfulResult()); }