public void GetRetryDelay_FirstTry_ReturnsBaseDelay()
        {
            // Arrange
            var classUnderTest = new LimitedExponentialBackoffRetryStrategy();
            var context        = new RetryContext();

            // Act
            classUnderTest.BaseDelay = TimeSpan.FromMilliseconds(200);
            var retryDelay = classUnderTest.NextRetryDelay(context);

            // Assert
            Assert.AreEqual(TimeSpan.FromMilliseconds(200), retryDelay);
        }
        public void GetRetryDelay_ThirdTry_Returns400Milliseconds()
        {
            // Arrange
            var classUnderTest = new LimitedExponentialBackoffRetryStrategy();
            var context        = new RetryContext();

            context.Update();
            context.Update();

            // Act
            var retryDelay = classUnderTest.NextRetryDelay(context);

            // Assert
            Assert.AreEqual(TimeSpan.FromMilliseconds(400), retryDelay);
        }
        public void NextRetryDelay_CounterReachesMax_ShouldReturnMaxDelay()
        {
            // Arrange
            var classUnderTest = new LimitedExponentialBackoffRetryStrategy {
                MaxDelay = TimeSpan.FromMinutes(2)
            };
            var mockeContext = new Mock <IRetryContext>();

            mockeContext.Setup(context => context.Count).Returns(int.MaxValue);

            // Act
            var retryDelay = classUnderTest.NextRetryDelay(mockeContext.Object);

            // Assert
            Assert.AreEqual(TimeSpan.FromMinutes(2), retryDelay);
        }
        public void GetRetryDelay_CalculatedExponentialValueExceedsMaxDelay_ReturnedValueDoesNotExceedMaxDelay()
        {
            // Arrange
            var classUnderTest = new LimitedExponentialBackoffRetryStrategy
            {
                MaxDelay = TimeSpan.FromMilliseconds(500)
            };
            var context = new RetryContext();

            context.Update();
            context.Update();
            context.Update();

            // Act
            var retryDelay = classUnderTest.NextRetryDelay(context);

            // Assert
            Assert.AreEqual(TimeSpan.FromMilliseconds(500), retryDelay);
        }