using SuiteLink.Client.Internal; namespace SuiteLink.Client.Tests.Internal; public sealed class SuiteLinkRetryDelayCalculatorTests { [Fact] public void GetDelay_UsesImmediateThenExponentialCap() { var policy = new SuiteLinkRetryPolicy( initialDelay: TimeSpan.FromSeconds(1), multiplier: 2.0, maxDelay: TimeSpan.FromSeconds(30), useJitter: false); Assert.Equal(TimeSpan.Zero, SuiteLinkRetryDelayCalculator.GetDelay(policy, 0)); Assert.Equal(TimeSpan.FromSeconds(1), SuiteLinkRetryDelayCalculator.GetDelay(policy, 1)); Assert.Equal(TimeSpan.FromSeconds(2), SuiteLinkRetryDelayCalculator.GetDelay(policy, 2)); Assert.Equal(TimeSpan.FromSeconds(4), SuiteLinkRetryDelayCalculator.GetDelay(policy, 3)); } [Theory] [InlineData(-1, 2.0, 30)] [InlineData(1, 0.0, 30)] [InlineData(1, -1.0, 30)] [InlineData(1, 2.0, -1)] public void RetryPolicy_InvalidArguments_Throw( int initialDelaySeconds, double multiplier, int maxDelaySeconds) { Assert.ThrowsAny(() => new SuiteLinkRetryPolicy( initialDelay: TimeSpan.FromSeconds(initialDelaySeconds), multiplier: multiplier, maxDelay: TimeSpan.FromSeconds(maxDelaySeconds), useJitter: false)); } [Fact] public void GetDelay_WithJitterEnabled_StaysWithinCap() { var policy = new SuiteLinkRetryPolicy( initialDelay: TimeSpan.FromSeconds(2), multiplier: 2.0, maxDelay: TimeSpan.FromSeconds(10), useJitter: true); var delay = SuiteLinkRetryDelayCalculator.GetDelay(policy, 3, () => 0.5); Assert.InRange(delay, TimeSpan.Zero, TimeSpan.FromSeconds(10)); } }