// // Copyright (c) StellaOps. Licensed under BUSL-1.1. // using FluentAssertions; using System.Threading; using Xunit; namespace StellaOps.HybridLogicalClock.Tests; public sealed partial class HybridLogicalClockTests { [Fact] public async Task InitializeFromStateAsync_NoState_ReturnsFalseAsync() { var timeProvider = CreateTimeProvider(FixedTime); var clock = CreateClock(timeProvider); var result = await clock.InitializeFromStateAsync(CancellationToken.None); result.Should().BeFalse(); clock.Current.PhysicalTime.Should().Be(0); clock.Current.LogicalCounter.Should().Be(0); } [Fact] public async Task InitializeFromStateAsync_PersistedAhead_UsesPersistedTimeAsync() { var timeProvider = CreateTimeProvider(FixedTime); var stateStore = new InMemoryHlcStateStore(); var persisted = CreateRemoteTimestamp(FixedTime.AddMilliseconds(10), 3, TestNodeId); await stateStore.SaveAsync(persisted, CancellationToken.None); var clock = CreateClock(timeProvider, store: stateStore); var result = await clock.InitializeFromStateAsync(CancellationToken.None); result.Should().BeTrue(); clock.Current.PhysicalTime.Should().Be(persisted.PhysicalTime); clock.Current.LogicalCounter.Should().Be(persisted.LogicalCounter + 1); } [Fact] public async Task InitializeFromStateAsync_PhysicalNowAhead_ResetsCounterAsync() { var physicalNow = FixedTime.AddMilliseconds(50); var timeProvider = CreateTimeProvider(physicalNow); var stateStore = new InMemoryHlcStateStore(); var persisted = CreateRemoteTimestamp(FixedTime, 7, TestNodeId); await stateStore.SaveAsync(persisted, CancellationToken.None); var clock = CreateClock(timeProvider, store: stateStore); var result = await clock.InitializeFromStateAsync(CancellationToken.None); result.Should().BeTrue(); clock.Current.PhysicalTime.Should().Be(physicalNow.ToUnixTimeMilliseconds()); clock.Current.LogicalCounter.Should().Be(0); } }