Example #1
0
        public void GroupEpisodesIntoPeriods_GroupsBasedOnEndingOutcomeType()
        {
            // Act
            var periods = _testTreatmentEvents.GroupEpisodesIntoPeriods();

            // Assert
            Assert.Equal(5, periods.Count);
            var expectedPeriod0 = TreatmentPeriod.CreatePeriodFromEvents(1,
                                                                         new List <TreatmentEvent> {
                _testTreatmentEvents[0], _testTreatmentEvents[1]
            },
                                                                         _testTreatmentEvents[1].EventDate);

            var expectedPeriod1 = TreatmentPeriod.CreateTransferPeriod(_testTreatmentEvents[2]);

            var expectedPeriod2 = TreatmentPeriod.CreateTreatmentPeriod(2, _testTreatmentEvents[3]);

            var expectedPeriod3 = TreatmentPeriod.CreatePeriodFromEvents(3,
                                                                         new List <TreatmentEvent> {
                _testTreatmentEvents[5], _testTreatmentEvents[4]
            },
                                                                         _testTreatmentEvents[4].EventDate);

            var expectedPeriod4 = TreatmentPeriod.CreatePeriodFromEvents(4,
                                                                         new List <TreatmentEvent> {
                _testTreatmentEvents[6], _testTreatmentEvents[8], _testTreatmentEvents[7]
            },
                                                                         _testTreatmentEvents[7].EventDate);

            AssertTreatmentPeriodMatchesExpected(expectedPeriod0, periods[0]);
            AssertTreatmentPeriodMatchesExpected(expectedPeriod1, periods[1]);
            AssertTreatmentPeriodMatchesExpected(expectedPeriod2, periods[2]);
            AssertTreatmentPeriodMatchesExpected(expectedPeriod3, periods[3]);
            AssertTreatmentPeriodMatchesExpected(expectedPeriod4, periods[4]);
        }
        public static List <TreatmentPeriod> GroupEpisodesIntoPeriods(this IEnumerable <TreatmentEvent> treatmentEvents, bool isPostMortemWithCorrectEvents = false)
        {
            var treatmentPeriods = new List <TreatmentPeriod>();
            var periodNumber     = 1;

            if (isPostMortemWithCorrectEvents)
            {
                var deathDate  = treatmentEvents.Single(te => te.TreatmentEventIsDeathEvent).EventDate;
                var onlyPeriod = TreatmentPeriod.CreatePeriodFromEvents(1, treatmentEvents.OrderForEpisodes(), deathDate);
                return(new List <TreatmentPeriod> {
                    onlyPeriod
                });
            }

            // The treatment period to append to; if it is null then a new period should be created
            TreatmentPeriod currentTreatmentPeriod = null;

            foreach (var treatmentEvent in treatmentEvents.OrderForEpisodes())
            {
                // If at the start of a new treatment period, make it and add the event
                if (currentTreatmentPeriod == null)
                {
                    // If a transfer out event, make a special period just for this event
                    if (treatmentEvent.TreatmentEventType == TreatmentEventType.TransferOut)
                    {
                        currentTreatmentPeriod = TreatmentPeriod.CreateTransferPeriod(treatmentEvent);
                    }
                    else
                    {
                        currentTreatmentPeriod = TreatmentPeriod.CreateTreatmentPeriod(periodNumber, treatmentEvent);
                        periodNumber++;
                    }

                    treatmentPeriods.Add(currentTreatmentPeriod);
                }
                // Otherwise append this event to the existing period
                else
                {
                    currentTreatmentPeriod.AddTreatmentEvent(treatmentEvent);
                }

                if (treatmentEvent.IsEpisodeEndingTreatmentEvent())
                {
                    currentTreatmentPeriod = null;
                }
            }

            return(treatmentPeriods);
        }