Files

112 lines
3.5 KiB
C#
Raw Permalink Normal View History

using SafelyYou.Data;
2026-08-06 13:47:49 -05:00
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));
});
}
}