public void AppliesStatusChangedWhenStatusWasInsertedAfterAnotherWasRemoved()
        {
            //1: Given set status
            //2: => delete status from step 1
            //3: => import new status with same lifetime
            //

            var register = Arrange(Generate.StreetNameWasRegistered);

            var sut = StreetName.Factory();

            sut.Initialize(new List <object> {
                register
            });

            var crabLifetime  = new CrabLifetime(new DateTime(1830, 1, 1).ToCrabLocalDateTime(), null);
            var firstStatusId = Arrange(Generate.CrabStreetNameStatusId);

            sut = Act(sut, CrabStreetNameStatus.InUse, crabLifetime, CrabModification.Historize, firstStatusId);
            sut = Act(sut, CrabStreetNameStatus.InUse, crabLifetime, CrabModification.Delete, firstStatusId);

            sut.Should().HaveSingleChange <StreetNameStatusWasRemoved>();
            sut.Should().HaveSingleChange <StreetNameBecameIncomplete>();

            sut.ClearChanges();

            sut = Act(sut, CrabStreetNameStatus.Proposed, crabLifetime, CrabModification.Insert);

            sut.Should().HaveSingleChange <StreetNameWasProposed>();
            sut.Should().HaveSingleChange <StreetNameBecameComplete>();
            sut.Should().NotHaveAnyChange <StreetNameBecameCurrent>();
            sut.Should().NotHaveAnyChange <StreetNameWasCorrectedToCurrent>();
            sut.Should().NotHaveAnyChange <StreetNameWasCorrectedToProposed>();
        }
        public void AppliesCorrectStatusChangedWhenOlderStatusWasInserted()
        {
            //1: Given set status
            //2: => import with new status older lifetime
            //3: => import with status from step 1, with same begin, but different end

            var register = Arrange(Generate.StreetNameWasRegistered);

            var sut = StreetName.Factory();

            sut.Initialize(new List <object> {
                register
            });

            var firstDate     = new DateTime(1830, 1, 1).ToCrabLocalDateTime();
            var secondDate    = new DateTime(2015, 1, 1).ToCrabLocalDateTime();
            var firstStatusId = Arrange(Generate.CrabStreetNameStatusId);

            sut = Act(sut, CrabStreetNameStatus.InUse, new CrabLifetime(secondDate, null), CrabModification.Historize, firstStatusId);
            sut = Act(sut, CrabStreetNameStatus.Proposed, new CrabLifetime(firstDate, null), CrabModification.Insert);
            sut = Act(sut, CrabStreetNameStatus.InUse, new CrabLifetime(firstDate, secondDate), CrabModification.Correction, firstStatusId);

            sut.Should().HaveSingleChange <StreetNameBecameCurrent>();
            sut.Should().NotHaveAnyChange <StreetNameWasProposed>();
            sut.Should().NotHaveAnyChange <StreetNameWasCorrectedToCurrent>();
            sut.Should().NotHaveAnyChange <StreetNameWasCorrectedToProposed>();
        }
        public void NoChangesWhenStatusWasDeletedOfAnNonCurrentStatus()
        {
            //1: Given set status
            //2: => import new status (new id)
            //3: => import with status from step 1 with modification delete
            var register = Arrange(Generate.StreetNameWasRegistered);
            var sut      = StreetName.Factory();

            sut.Initialize(new List <object> {
                register
            });

            var firstStatusId  = Arrange(Generate.CrabStreetNameStatusId);
            var secondStatusId = Arrange(Generate.CrabStreetNameStatusId);

            var lifetime = new CrabLifetime(DateTime.MinValue.ToCrabLocalDateTime(), null);

            Act(sut, CrabStreetNameStatus.Proposed, lifetime, CrabModification.Insert, firstStatusId);
            Act(sut, CrabStreetNameStatus.InUse, lifetime, CrabModification.Insert, secondStatusId);
            Act(sut, CrabStreetNameStatus.Proposed, lifetime, CrabModification.Delete, firstStatusId);

            sut.Should().NotHaveAnyChange <StreetNameStatusWasRemoved>();
        }