public async Task ClampDelay()
        {
            Stopwatch watch = new Stopwatch();
            var       delay = new ManualRetryDelay
            {
                Delay    = TimeSpan.FromMilliseconds(100),
                MaxDelay = TimeSpan.FromMilliseconds(250)
            };

            delay.Update(throttled: true);
            await delay.WaitIfNeededAsync();

            delay.Update(throttled: true);
            await delay.WaitIfNeededAsync();

            delay.Update(throttled: true);
            await delay.WaitIfNeededAsync();

            delay.Update(throttled: true);

            watch.Start();
            await delay.WaitIfNeededAsync();

            watch.Stop();

            Assert.IsTrue(
                248 <= watch.ElapsedMilliseconds && watch.ElapsedMilliseconds <= 500,
                $"Expected a delay between 248ms and 500ms, not {watch.ElapsedMilliseconds}");
        }
        public async Task ClearDelay()
        {
            Stopwatch watch = new Stopwatch();
            var       delay = new ManualRetryDelay
            {
                Delay    = TimeSpan.FromMilliseconds(100),
                MaxDelay = TimeSpan.FromMilliseconds(250)
            };

            delay.Update(throttled: true);
            await delay.WaitIfNeededAsync();

            delay.Update(throttled: true);
            await delay.WaitIfNeededAsync();

            delay.Update(throttled: false);
            watch.Start();
            await delay.WaitIfNeededAsync();

            watch.Stop();

            Assert.IsTrue(
                watch.ElapsedMilliseconds < 100,
                $"Expected a delay less than 100ms, not {watch.ElapsedMilliseconds}");
        }
        public async Task NoDelay()
        {
            Stopwatch watch = new Stopwatch();
            var       delay = new ManualRetryDelay
            {
                Delay    = TimeSpan.FromMilliseconds(100),
                MaxDelay = TimeSpan.FromMilliseconds(250)
            };

            watch.Start();
            await delay.WaitIfNeededAsync();

            watch.Stop();

            Assert.Greater(50, watch.ElapsedMilliseconds);
        }
        public async Task AddsDelay()
        {
            Stopwatch watch = new Stopwatch();
            var       delay = new ManualRetryDelay
            {
                Delay    = TimeSpan.FromMilliseconds(100),
                MaxDelay = TimeSpan.FromMilliseconds(250)
            };

            delay.Update(throttled: true);
            watch.Start();
            await delay.WaitIfNeededAsync();

            watch.Stop();

            Assert.LessOrEqual(80, watch.ElapsedMilliseconds);
        }
        public async Task NoDelayIfCalledAfterWait()
        {
            Stopwatch watch = new Stopwatch();
            var       delay = new ManualRetryDelay
            {
                Delay    = TimeSpan.FromMilliseconds(100),
                MaxDelay = TimeSpan.FromMilliseconds(250)
            };

            delay.Update(throttled: true);
            await Task.Delay(TimeSpan.FromMilliseconds(120));

            watch.Start();
            await delay.WaitIfNeededAsync();

            watch.Stop();

            Assert.Greater(50, watch.ElapsedMilliseconds);
        }