public void Create_ConferenceWithTrack_ReturnsConference()
        {
            // Arrange
            var conferenceId             = Guid.NewGuid();
            var trackId                  = Guid.NewGuid();
            var createConferenceIdResult = ConferenceId.Create(conferenceId);
            var createTrackIdResult      = TrackId.Create(trackId);
            var createConferenceResult   = Conference.Create(createConferenceIdResult.Data);
            var conference               = createConferenceResult.Data;

            // Act
            var addTrackResult = conference.AddTrack(createTrackIdResult.Data);

            // Assert
            Assert.IsNotNull(addTrackResult.Data);
            var trackCreated = conference.Events.OfType <TrackCreated>().FirstOrDefault();

            Assert.IsNotNull(trackCreated);
            Assert.AreEqual(createTrackIdResult.Data, trackCreated.TrackId);

            var trackAddedToConference = conference.Events.OfType <TrackAddedToConference>().FirstOrDefault();

            Assert.IsNotNull(trackAddedToConference);
            Assert.AreEqual(createTrackIdResult.Data, trackAddedToConference.TrackId);
            Assert.AreEqual(conference.ConferenceId, trackAddedToConference.ConferenceId);
            Assert.AreEqual(1, conference.GetTracks().Count);
        }
        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);
        }
        public void Create_EmptyConferenceWithId_ReturnsConference()
        {
            // Arrange
            var id = Guid.NewGuid();
            var createConferenceIdResult = ConferenceId.Create(id);

            // Act
            var createConferenceResult = Conference.Create(createConferenceIdResult.Data);

            // Assert
            var conference = createConferenceResult.Data;

            Assert.AreEqual(createConferenceIdResult.Data, conference.ConferenceId);
            Assert.AreEqual(0, conference.GetTracks().Count);

            var firstEvent = conference.Events.OfType <ConferenceCreated>().FirstOrDefault();

            Assert.AreEqual(typeof(ConferenceCreated), firstEvent.GetType());
            Assert.AreEqual(conference.ConferenceId, firstEvent.Id);
        }