// // Copyright (c) StellaOps. Licensed under BUSL-1.1. // using FluentAssertions; using System; using System.Threading; using Xunit; namespace StellaOps.HybridLogicalClock.Tests; public sealed partial class InMemoryHlcStateStoreTests { [Fact] public async Task SaveAsync_ThenLoadAsync_ReturnsStateAsync() { var store = new InMemoryHlcStateStore(); var timestamp = CreateTimestamp("node1", 1000, 5); await store.SaveAsync(timestamp, CancellationToken.None); var result = await store.LoadAsync("node1", CancellationToken.None); result.Should().Be(timestamp); } [Fact] public async Task SaveAsync_GreaterTimestamp_UpdatesAsync() { var store = new InMemoryHlcStateStore(); var first = CreateTimestamp("node1", 1000, 5); var second = CreateTimestamp("node1", 1000, 10); await store.SaveAsync(first, CancellationToken.None); await store.SaveAsync(second, CancellationToken.None); var result = await store.LoadAsync("node1", CancellationToken.None); result.Should().Be(second); } [Fact] public async Task SaveAsync_SmallerTimestamp_DoesNotUpdateAsync() { var store = new InMemoryHlcStateStore(); var first = CreateTimestamp("node1", 1000, 10); var second = CreateTimestamp("node1", 1000, 5); await store.SaveAsync(first, CancellationToken.None); await store.SaveAsync(second, CancellationToken.None); var result = await store.LoadAsync("node1", CancellationToken.None); result.Should().Be(first); } [Fact] public async Task SaveAsync_Cancelled_ThrowsOperationCanceledExceptionAsync() { var store = new InMemoryHlcStateStore(); using var cts = new CancellationTokenSource(); cts.Cancel(); var act = () => store.SaveAsync(CreateTimestamp("node1", 1000, 1), cts.Token); await act.Should().ThrowAsync(); } }