public void Create_ConferenceWithTalkInAfternoon_ReturnsConference()
        {
            // Arrange
            var conferenceId    = Guid.NewGuid();
            var trackId         = Guid.NewGuid();
            var talkIdAfternoon = Guid.NewGuid();

            var conferenceIdObj = ConferenceId.Create(conferenceId).Data;
            var conference      = Conference.Create(conferenceIdObj).Data;
            var trackIdObj      = TrackId.Create(trackId).Data;

            conference.AddTrack(trackIdObj);

            AddTalkToTrack(conference, trackIdObj, Guid.NewGuid(), "Morning - 1", "1st Morning Session 60 mins", 60);
            AddTalkToTrack(conference, trackIdObj, Guid.NewGuid(), "Morning - 2", "2nd Morning Session 60 mins", 60);
            AddTalkToTrack(conference, trackIdObj, Guid.NewGuid(), "Morning - 3", "3rd Morning Session 60 mins", 60);

            var talkIdObjAfternoon   = TalkId.Create(talkIdAfternoon).Data;
            var titleAfternoon       = Title.Create("Afternoon talk").Data;
            var descriptionAfternoon = Description.Create("This is the Afternoon talk").Data;
            var durationAfternoon    = Duration.Create(TimeSpan.FromMinutes(45)).Data;         // 45 mins
            var startTimeAfternoon   = TalkStartTime.Create(DateTime.Today.AddHours(13)).Data; // 1PM

            // Act
            var afternoonTalkAddedToTrackEventResult = conference.AddTalkToTrack(trackIdObj, talkIdObjAfternoon, titleAfternoon, descriptionAfternoon, durationAfternoon);

            // Assert
            Assert.IsTrue(afternoonTalkAddedToTrackEventResult.IsSuccess);
            var talkAddedToTrackEvent = conference.Events.OfType <TalkAddedToTrack>().LastOrDefault();

            Assert.IsNotNull(talkAddedToTrackEvent);
            Assert.AreEqual(trackIdObj, talkAddedToTrackEvent.TrackId);
            Assert.AreEqual(talkIdObjAfternoon, talkAddedToTrackEvent.TalkId);
            Assert.AreEqual(startTimeAfternoon, talkAddedToTrackEvent.StartTime);
        }
        public void Create_ConferenceWithTalkInMorning_ReturnsConference()
        {
            // Arrange
            var conferenceId = Guid.NewGuid();
            var trackId      = Guid.NewGuid();
            var talkId       = Guid.NewGuid();

            var conferenceIdObj        = ConferenceId.Create(conferenceId).Data;
            var trackIdObj             = TrackId.Create(trackId).Data;
            var talkIdObj              = TalkId.Create(talkId).Data;
            var title                  = Title.Create("First talk").Data;
            var description            = Description.Create("This is the first talk").Data;
            var duration               = Duration.Create(TimeSpan.FromMinutes(30)).Data;        // 30 minutes
            var morningSessionDateTime = TalkStartTime.Create(DateTime.Today.AddHours(9)).Data; // 9AM

            var conference = Conference.Create(conferenceIdObj).Data;

            conference.AddTrack(trackIdObj);

            // Act
            var addTalkToTrackResult = conference.AddTalkToTrack(trackIdObj, talkIdObj, title, description, duration);

            // Assert
            Assert.IsTrue(addTalkToTrackResult.IsSuccess);
            var talkAddedToTrackEvent = conference.Events.OfType <TalkAddedToTrack>().FirstOrDefault();

            Assert.IsNotNull(talkAddedToTrackEvent);
            Assert.AreEqual(trackIdObj, talkAddedToTrackEvent.TrackId);
            Assert.AreEqual(talkIdObj, talkAddedToTrackEvent.TalkId);
            Assert.AreEqual(morningSessionDateTime, talkAddedToTrackEvent.StartTime);
            Assert.IsNull(addTalkToTrackResult.Error);
        }
        private static Result <TalkId> AddTalkToTrack(Conference conference, TrackId trackIdObj, Guid talkId, string title, string description, int durationInMinutes)
        {
            var talkIdObj      = TalkId.Create(talkId).Data;
            var titleObj       = Title.Create(title).Data;
            var descriptionObj = Description.Create(description).Data;
            var durationObj    = Duration.Create(TimeSpan.FromMinutes(durationInMinutes)).Data;

            return(conference.AddTalkToTrack(trackIdObj, talkIdObj, titleObj, descriptionObj, durationObj));
        }