using SafelyYou.Data; namespace SafelyYouTests; public class HeartBeatHistoriesUptimeTests { private static readonly DeviceId Device = new("device-1"); private static readonly DateTimeOffset T0 = new(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); [Test] public void Uptime_UnknownDevice_ReturnsZero() { var histories = new HeartBeatHistories(); Assert.That(histories.Uptime(Device), Is.EqualTo(0)); } [Test] public void Uptime_SingleHeartbeat_ReturnsZero() { var histories = new HeartBeatHistories(); histories.Add(Device, T0); // first == last => TotalMinutes is 0, guarded to return 0 Assert.That(histories.Uptime(Device), Is.EqualTo(0)); } [Test] public void Uptime_TwoHeartbeatsOneMinuteApart_ReturnsTwoHundred() { var histories = new HeartBeatHistories(); histories.Add(Device, T0); histories.Add(Device, T0.AddMinutes(1)); // (2 beats / 1 minute) * 100 Assert.That(histories.Uptime(Device), Is.EqualTo(200).Within(0.001)); } [Test] public void Uptime_TwoHeartbeatsOverTwoMinutes_ReturnsOneHundred() { var histories = new HeartBeatHistories(); histories.Add(Device, T0); histories.Add(Device, T0.AddMinutes(2)); // (2 beats / 2 minutes) * 100 Assert.That(histories.Uptime(Device), Is.EqualTo(100).Within(0.001)); } [Test] public void Uptime_ThreeHeartbeatsOverTwoMinutes_ReturnsOneHundredFifty() { var histories = new HeartBeatHistories(); histories.Add(Device, T0); histories.Add(Device, T0.AddMinutes(1)); histories.Add(Device, T0.AddMinutes(2)); // (3 beats / 2 minutes) * 100 Assert.That(histories.Uptime(Device), Is.EqualTo(150).Within(0.001)); } [Test] public void Uptime_IsPerDevice() { var other = new DeviceId("device-2"); var histories = new HeartBeatHistories(); histories.Add(Device, T0); histories.Add(Device, T0.AddMinutes(1)); histories.Add(other, T0); Assert.Multiple(() => { Assert.That(histories.Uptime(Device), Is.EqualTo(200).Within(0.001)); Assert.That(histories.Uptime(other), Is.EqualTo(0)); }); } [Test] public void Uptime_OutOfSequenceHeartbeat_DoesNotAffectCalculation() { var histories = new HeartBeatHistories(); histories.Add(Device, T0.AddMinutes(1)); histories.Add(Device, T0); // rejected histories.Add(Device, T0.AddMinutes(3)); // still 2 beats over 2 minutes Assert.That(histories.Uptime(Device), Is.EqualTo(100).Within(0.001)); } }