using SafelyYou; namespace SafelyYouTests; public class DeviceHeartBeatHistoryTests { private static readonly DateTimeOffset T0 = new(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); private static readonly DateTimeOffset T1 = T0.AddMinutes(1); private static readonly DateTimeOffset T2 = T0.AddMinutes(2); [Test] public void Add_FirstHeartbeat_SetsFirstLastAndCount() { var history = new DeviceHeartBeatHistory(); var result = history.Add(T0); Assert.Multiple(() => { Assert.That(result, Is.EqualTo(DeviceHeartBeatHistory.AddResult.Added)); Assert.That(history.NumberOfHeartBeats, Is.EqualTo(1)); Assert.That(history.FirstHeartBeat, Is.EqualTo(T0)); Assert.That(history.LastHeartBeat, Is.EqualTo(T0)); }); } [Test] public void Add_LaterHeartbeat_UpdatesLastAndIncrementsCount() { var history = new DeviceHeartBeatHistory(); history.Add(T0); var result = history.Add(T1); Assert.Multiple(() => { Assert.That(result, Is.EqualTo(DeviceHeartBeatHistory.AddResult.Added)); Assert.That(history.NumberOfHeartBeats, Is.EqualTo(2)); Assert.That(history.FirstHeartBeat, Is.EqualTo(T0)); Assert.That(history.LastHeartBeat, Is.EqualTo(T1)); }); } [Test] public void Add_SameTimestampAsLast_IsAccepted() { var history = new DeviceHeartBeatHistory(); history.Add(T0); var result = history.Add(T0); Assert.Multiple(() => { Assert.That(result, Is.EqualTo(DeviceHeartBeatHistory.AddResult.Added)); Assert.That(history.NumberOfHeartBeats, Is.EqualTo(2)); Assert.That(history.FirstHeartBeat, Is.EqualTo(T0)); Assert.That(history.LastHeartBeat, Is.EqualTo(T0)); }); } [Test] public void Add_EarlierThanLast_ReturnsOutOfSequenceAndDoesNotMutate() { var history = new DeviceHeartBeatHistory(); history.Add(T1); var result = history.Add(T0); Assert.Multiple(() => { Assert.That(result, Is.EqualTo(DeviceHeartBeatHistory.AddResult.OutOfSequence)); Assert.That(history.NumberOfHeartBeats, Is.EqualTo(1)); Assert.That(history.FirstHeartBeat, Is.EqualTo(T1)); Assert.That(history.LastHeartBeat, Is.EqualTo(T1)); }); } [Test] public void Add_MultipleInOrder_KeepsFirstAndAdvancesLast() { var history = new DeviceHeartBeatHistory(); Assert.That(history.Add(T0), Is.EqualTo(DeviceHeartBeatHistory.AddResult.Added)); Assert.That(history.Add(T1), Is.EqualTo(DeviceHeartBeatHistory.AddResult.Added)); Assert.That(history.Add(T2), Is.EqualTo(DeviceHeartBeatHistory.AddResult.Added)); Assert.Multiple(() => { Assert.That(history.NumberOfHeartBeats, Is.EqualTo(3)); Assert.That(history.FirstHeartBeat, Is.EqualTo(T0)); Assert.That(history.LastHeartBeat, Is.EqualTo(T2)); }); } [Test] public void Add_WithGap_StillCountsHeartbeat() { var history = new DeviceHeartBeatHistory(); history.Add(T0); var muchLater = T0.AddHours(1); var result = history.Add(muchLater); Assert.Multiple(() => { Assert.That(result, Is.EqualTo(DeviceHeartBeatHistory.AddResult.Added)); Assert.That(history.NumberOfHeartBeats, Is.EqualTo(2)); Assert.That(history.LastHeartBeat, Is.EqualTo(muchLater)); }); } }