public void InvokeSuccess()
        {
            var instance     = new RetryProxySubject();
            var retryTest    = new CanRetryProxySubjectException();
            var retryOptions = new RetryOptions(5, TimeSpan.FromSeconds(5));
            var retryProxy   = RetryProxy.Create <IRetryProxySubject>(instance, retryOptions, retryTest);
            var result       = retryProxy.Succeed();

            Assert.AreEqual("succeed", result);
        }
        public void Create_OptionsNull()
        {
            var instance       = new RetryProxySubject();
            var options        = new RetryOptions(5, TimeSpan.FromSeconds(5));
            var canRetryTester = new CanRetryProxySubjectException();

            try
            {
                var retryProxy = RetryProxy.Create <IRetryProxySubject>(instance, null, canRetryTester);
            }
            catch (ArgumentNullException ex)
            {
                Assert.AreEqual(nameof(options), ex.ParamName);
                throw;
            }
        }
        public void InvokeFailure_RetryForbidden()
        {
            var instance     = new RetryProxySubject();
            var retryTest    = new CanNotRetryProxySubjectException();
            var retryOptions = new RetryOptions(5, TimeSpan.FromSeconds(5));
            var retryProxy   = RetryProxy.Create <IRetryProxySubject>(instance, retryOptions, retryTest);

            try
            {
                var result = retryProxy.Fail();
            }
            catch (RetryException ex)
            {
                Assert.IsTrue(ex.InnerException is ProxySubjectTestException);
                Assert.AreEqual(1, ex.Attempts);
                Assert.AreEqual(ex.Attempts, ex.Exceptions.Count);
                throw;
            }
        }