Example #1
0
        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));
        }
Example #2
0
        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));
        }
Example #3
0
        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"));
        }