public void NoJitter()
        {
            var options               = RetriableTransactionOptions.CreateWithNoJitter();
            var delay                 = TimeSpan.FromTicks(TimeSpan.TicksPerMillisecond);
            var delayTicks            = (int)delay.Ticks;
            var expectedJitteredTicks = delayTicks;

            // This shouldn't jitter at all, 50_000 seems a good enough sample
            // to test that.
            var delays = Enumerable.Range(0, 50_000)
                         .Select(_ => options.Jitter(delay))
                         .ToList();
            var min = delays.Min();
            var max = delays.Max();

            Assert.Equal(expectedJitteredTicks, min.Ticks);
            Assert.Equal(expectedJitteredTicks, max.Ticks);
        }
        public void DefaultJitter()
        {
            var options = RetriableTransactionOptions.CreateDefault();

            var delay      = TimeSpan.FromTicks(TimeSpan.TicksPerMillisecond);
            var delayTicks = (int)delay.Ticks;
            // The jitter on RetriableTransactionOptions should jitter between
            // delay and delay * 2.
            var expectedMinDelayTicks    = delayTicks;
            var expectedMaxDelayTicks    = delayTicks * 2;
            var expectedMedianDelayTicks = (expectedMinDelayTicks + expectedMaxDelayTicks) / 2;

            var delays = Enumerable.Range(0, 10_000)
                         .Select(_ => options.Jitter(delay))
                         .ToList();
            var underMedianCount = delays.LongCount(ts => ts.Ticks <= expectedMedianDelayTicks);

            Assert.InRange(underMedianCount, 4_000, 6_000);
        }