コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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());
        }