GivenRepeatedlyFailingFunctionToPerformAndActionToPerformOnRepeatedFailure_WhenWrappingSimpleFunctionWithCatchAndExecuting_ShouldPerformFunctionAFewTimesBeforeExecutingActionOnRepeatedFailure () { //Given Func <int> functionToWrap = () => FunctionToPerformByTryCatchBuilder(true); bool hasOnRepeatedFailActionPerformed = false; Action actionOnRepeatedFail = () => hasOnRepeatedFailActionPerformed = true; int numberOfTries = 4; int numberofRetries = numberOfTries - 1; _throwedExceptions = 0; //When Func <int> wrappedFunction = TryCatchBuilder <int> .Try(functionToWrap) .Catch <Exception>(JustCountTheRetries) .ReTry(numberofRetries, TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(1)) .OnRepeatedFailure(actionOnRepeatedFail) .Build(); wrappedFunction(); //Then Assert.That(hasOnRepeatedFailActionPerformed, Is.True); Assert.That(_throwedExceptions, Is.EqualTo(numberOfTries)); }
GivenFunctionAFewTimesFailingButFinallySucceeding_WhenWrappingSimpleFunctionFunctionWithCatchAndExecuting_ShouldNotPerformRepeatedFailureAction () { //Given int numberOfFailedTries = 2; int numberOfTries = 4; int numberofRetries = numberOfTries - 1; Func <int> functionToWrap = () => { if (_throwedExceptions < numberOfFailedTries) { throw new Exception(); } return(1); }; bool hasOnRepeatedFailActionPerformed = false; Action actionOnRepeatedFail = () => hasOnRepeatedFailActionPerformed = true; _throwedExceptions = 0; //When Func <int> wrappedFunction = TryCatchBuilder <int> .Try(functionToWrap) .Catch <Exception>(JustCountTheRetries) .ReTry(numberofRetries, TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(1)) .OnRepeatedFailure(actionOnRepeatedFail) .Build(); wrappedFunction(); //Then Assert.That(hasOnRepeatedFailActionPerformed, Is.False); Assert.That(_throwedExceptions, Is.EqualTo(numberOfFailedTries)); }
GivenFunctionToPerformAndActionToDoOnFail_WhenWrappingSimpleFunctionWithCatchAndExecuting_ShouldPerformActionGivenToCatchIfFailedAndNotIfNoExceptionThrown(bool shouldThrowException) { //Given Func <int> functionToWrap = () => FunctionToPerformByTryCatchBuilder(shouldThrowException); bool hasOnFailActionPerformed = false; Action <Exception> actionOnFail = exception => hasOnFailActionPerformed = true; //When Func <int> wrappedFunction = TryCatchBuilder <int> .Try(functionToWrap) .Catch <Exception>(actionOnFail) .Build(); wrappedFunction(); //Then Assert.That(hasOnFailActionPerformed, Is.EqualTo(shouldThrowException)); }
private TryCatchBuilder CreateBuildDataSerialization() { return(TryCatchBuilder .New() .AddTryCode( IfBuilder .New() .SetCondition( ConditionBuilder .New() .Set("response.Body != null")) .AddCode( IfBuilder .New() .SetCondition( ConditionBuilder .New() .Set("response.Body.RootElement.TryGetProperty(" + $"\"data\", out {TypeNames.JsonElement} " + "dataElement) && dataElement.ValueKind == " + $"{TypeNames.JsonValueKind}.Object")) .AddCode("data = BuildData(dataElement);")) .AddCode( IfBuilder .New() .SetCondition( ConditionBuilder .New() .Set( "response.Body.RootElement.TryGetProperty(" + $"\"errors\", out {TypeNames.JsonElement} " + "errorsElement)")) .AddCode($"errors = {TypeNames.ParseError}(errorsElement);"))) .AddCatchBlock( CatchBlockBuilder .New() .SetExceptionVariable("ex") .AddCode(CreateDataError()))); }
private void AddBuildMethod( InterfaceTypeDescriptor resultNamedType, ClassBuilder classBuilder) { var buildMethod = classBuilder .AddMethod() .SetAccessModifier(AccessModifier.Public) .SetName("Build") .SetReturnType( TypeReferenceBuilder .New() .SetName(TypeNames.IOperationResult) .AddGeneric(resultNamedType.RuntimeType.Name)); buildMethod .AddParameter(_response) .SetType(TypeNames.Response.WithGeneric(TypeNames.JsonDocument)); var concreteResultType = CreateResultInfoName(resultNamedType.ImplementedBy.First().RuntimeType.Name); buildMethod.AddCode( AssignmentBuilder .New() .SetLefthandSide( $"({resultNamedType.RuntimeType.Name} Result, {concreteResultType} " + "Info)? data") .SetRighthandSide("null")); buildMethod.AddCode( AssignmentBuilder .New() .SetLefthandSide( TypeNames.IReadOnlyList .WithGeneric(TypeNames.IClientError) .MakeNullable() + " errors") .SetRighthandSide("null")); buildMethod.AddEmptyLine(); buildMethod.AddCode( TryCatchBuilder .New() .AddTryCode( IfBuilder .New() .SetCondition( ConditionBuilder .New() .Set("response.Body != null")) .AddCode( IfBuilder .New() .SetCondition( ConditionBuilder .New() .Set("response.Body.RootElement.TryGetProperty(" + $"\"data\", out {TypeNames.JsonElement} " + "dataElement) && dataElement.ValueKind == " + $"{TypeNames.JsonValueKind}.Object")) .AddCode("data = BuildData(dataElement);")) .AddCode( IfBuilder .New() .SetCondition( ConditionBuilder .New() .Set( "response.Body.RootElement.TryGetProperty(" + $"\"errors\", out {TypeNames.JsonElement} " + "errorsElement)")) .AddCode($"errors = {TypeNames.ParseError}(errorsElement);"))) .AddCatchBlock( CatchBlockBuilder .New() .SetExceptionVariable("ex") .AddCode( AssignmentBuilder.New() .SetLefthandSide("errors") .SetRighthandSide( ArrayBuilder.New() .SetDetermineStatement(false) .SetType(TypeNames.IClientError) .AddAssigment( MethodCallBuilder .Inline() .SetNew() .SetMethodName(TypeNames.ClientError) .AddArgument("ex.Message") .AddArgument("exception: ex")))))); buildMethod.AddEmptyLine(); buildMethod.AddCode( MethodCallBuilder .New() .SetReturn() .SetNew() .SetMethodName(TypeNames.OperationResult) .AddGeneric(resultNamedType.RuntimeType.Name) .AddArgument("data?.Result") .AddArgument("data?.Info") .AddArgument(_resultDataFactory) .AddArgument("errors")); }