public void WhenPatientReadmitted_ThenRaiseAlert()
{
var events = new EventStream();
var query =
from discharged in events.Of<PatientLeftHospital>()
from admitted in events.Of<PatientEnteredHospital>()
where
admitted.PatientId == discharged.PatientId &&
(admitted.When - discharged.When).Days < 5
select admitted;
var readmitted = new List<int>();
using (var subscription = query.Subscribe(e => readmitted.Add(e.PatientId)))
{
// Two patients come in.
events.Push(new PatientEnteredHospital { PatientId = 1, When = new DateTime(2011, 1, 1) });
events.Push(new PatientEnteredHospital { PatientId = 2, When = new DateTime(2011, 1, 1) });
// Both leave same day.
events.Push(new PatientLeftHospital { PatientId = 1, When = new DateTime(2011, 1, 15) });
events.Push(new PatientLeftHospital { PatientId = 2, When = new DateTime(2011, 1, 15) });
// One comes back before 5 days passed.
events.Push(new PatientEnteredHospital { PatientId = 1, When = new DateTime(2011, 1, 18) });
// The other comes back after 10 days passed.
events.Push(new PatientEnteredHospital { PatientId = 1, When = new DateTime(2011, 1, 25) });
}
// We should have an alert for patient 1 who came back before 5 days passed.
Assert.Equal(1, readmitted.Count);
Assert.Equal(1, readmitted[0]);
}