public async Task AsyncPipeAddAllTypesExecutorsWithSkip()
        {
            var execIncOne     = new IntModelIncrementOneEtor();
            var execIncTwo     = new IntModelIncrementTwoEtor();
            var execIncTwo1    = new IntModelIncrementTwoEtor();
            var funcExecIncOne = ExecutorFactory.GetFuncIntModelIncrementOneEtor();
            var funcExecIncTwo = ExecutorFactory.GetFuncIntModelIncrementTwoEtor();
            var funcDefault    = ExecutorFactory.GetFuncDefaultEtor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .Executor(execIncOne).Label("exec_1").Add()
                       .Executor(execIncTwo, true).Label("exec_2").Add()
                       .Executor(execIncTwo1, false).Label("exec_21").Add() // skip
                       .Executor(funcExecIncOne).Label("exec_3").Add()
                       .Executor(funcExecIncTwo, true).Label("exec_4").Add()
                       .Executor(async(model) =>
            {
                var value      = await Task.FromResult <int>(10);
                model.Integer += value;
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_5").Add()
                       .Executor((model) =>
            {
                model.Integer += 20;
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_6").Add()
                       .Default(funcDefault).Add()
                       .Return((model, results) =>
            {
                if (results.Length < 7)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }
                if (results.Sum(x => x.Value) < 136)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }

                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value >= 136);
        }
        public async Task AsyncPipeWithStopWatchAndRetry()
        {
            var execIncOne = new IntDelay50Etor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, double>()
                       .Cache(false)
                       .StopWatch(true)
                       .Executor(execIncOne)
                       .Label("exec_1")
                       .StopWatch()
                       .Add()
                       .Executor(async(model, cache) =>
            {
                await Task.Delay(50);
                int count = cache.GetSafely <int>("break_count") + 1;
                cache.SetOrUpdateSafely <int>("break_count", count);
                return(PipeResult <double>
                       .DefaultUnSuccessful
                       .SetValue(50));
            })
                       .Label("exec_2")
                       .IfFail().Retry(3, 100).Set()
                       .StopWatch()
                       .Add()
                       .Default((model, cache) =>
            {
                int count = cache.GetSafely <int>("break_count");
                return(PipeResult <double>
                       .DefaultSuccessful
                       .SetValue(count));
            }).Add()
                       .Return((model, results) =>
            {
                var sumElapsed = TimeSpan.FromMilliseconds(
                    results.Sum(x => x.Elapsed.TotalMilliseconds));
                if (results.FirstOrDefault(x => x.Label == "Default").Value.Value == 4)
                {
                    return(PipeResult <double>
                           .DefaultSuccessful
                           .SetValue(sumElapsed.TotalMilliseconds));
                }

                return(PipeResult <double>
                       .DefaultUnSuccessful
                       .SetValue(sumElapsed.TotalMilliseconds));
            });

            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);

            Assert.True(result.Value > 450);
            Assert.True(result.Elapsed.TotalMilliseconds > result.Value);
        }
        public async Task CreateAsyncPipeTest()
        {
            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, bool>()
                       .Cache(false)
                       .Executor(x =>
            {
                x.Integer += 1;
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("FirstExecutor")
                       .Add()
                       .If(x => x.Integer > 0)
                       .Executor(x =>
            {
                x.Integer += 1;
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("SecondExecutor")
                       .Restricted(10, "SecondExecutor")
                       .StopWatch()
                       .ExecuteIf(x => x.Integer > 1)
                       .IfFail()
                       .Retry(3, 1000).Break(false).Set()
                       .IfOk()
                       .Return((m, r) => r).Set()
                       .Add()
                       .EndIf()
                       .Default((x, cache) =>
            {
                x.Integer += 100;
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("Default")
                       .Add()
                       .Return((model, results) =>
            {
                if (model.Integer >= 102)
                {
                    return(PipeResult <bool>
                           .DefaultSuccessful.SetValue(true));
                }
                return(PipeResult <bool>
                       .DefaultUnSuccessful);
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, bool> >(pipe);
            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.True(result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
        }
        public async Task AsyncPipeAddAllTypesWithCacheExecutors()
        {
            var execIncOne  = new IntModelIncrementOneEtor();
            var execIncTwo  = new IntModelIncrementTwoEtor();
            var funcDefault = ExecutorFactory.GetFuncDefaultCacheEtor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .Cache(false)
                       .Executor(execIncOne).Label("exec_1").Add()
                       .Executor(execIncTwo).Label("exec_2").Add()
                       .Executor(async(model, cache) =>
            {
                var value      = await Task.FromResult <int>(10);
                model.Integer += value;
                cache.SetSafely <int>("3", model.Integer);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_5").Add()
                       .Executor((model, cache) =>
            {
                model.Integer += 20;
                cache.SetSafely <int>("4", model.Integer);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_6").Add()
                       .Default(funcDefault).Add()
                       .Return((model, results) =>
            {
                if (results.Length < 5)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }
                if (results.Sum(x => x.Value) < 83)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }

                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value >= 83);
        }
Example #5
0
        public async Task ParallelPipeExecute()
        {
            var pipe = PipeBuilder
                       .AsyncParallelPipe <IntModel, bool>()
                       .Cache(true)
                       .StopWatch(true)
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 1")
                       .Add()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 2")
                       .Add()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 3")
                       .Add()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 4")
                       .Add()
                       .Return((model, results) =>
            {
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, bool> >(pipe);
            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.True(result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Elapsed < TimeSpan.FromSeconds(2));
        }
        public async Task AsyncPipeWithStopWatch()
        {
            var execIncOne = new Delay50Etor();
            var execIncTwo = new Delay100Etor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, TimeSpan>()
                       .StopWatch(true)
                       .Executor(execIncOne).Label("exec_1").StopWatch().Add()
                       .Executor(execIncTwo).Label("exec_2").StopWatch().Add()
                       .Executor(async(model, cache) =>
            {
                await Task.Delay(150);
                return(PipeResult <TimeSpan>
                       .DefaultSuccessful
                       .SetValue(TimeSpan.FromMilliseconds(150)));
            }).StopWatch().Label("exec_5").Add()
                       .Executor(async(model) =>
            {
                await Task.Delay(200);
                return(PipeResult <TimeSpan>
                       .DefaultSuccessful
                       .SetValue(TimeSpan.FromMilliseconds(200)));
            }).StopWatch().Label("exec_6").Add()
                       .Return((model, results) =>
            {
                var sumElapsed = TimeSpan.FromMilliseconds(
                    results.Sum(x => x.Elapsed.TotalMilliseconds));

                return(PipeResult <TimeSpan>
                       .DefaultSuccessful
                       .SetValue(sumElapsed));
            });

            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value.Value.TotalMilliseconds >= 500);
            Assert.True(result.Elapsed.TotalMilliseconds > result.Value.Value.TotalMilliseconds);
        }
Example #7
0
        public async Task ParralelSubPipe()
        {
            var subPipe = PipeBuilder
                          .AsyncParallelPipe <IntModel, int>()
                          .StopWatch(true)
                          .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("sub_1", 1);
                await Task.Delay(1000);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .Label("exc 1")
                          .Add()
                          .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("sub_2", 1);
                await Task.Delay(1000);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .Label("exc 2")
                          .Add()
                          .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("sub_3", 1);
                await Task.Delay(1000);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .Label("exc 3")
                          .Add()
                          .Return((model, results) =>
            {
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .ToExecutor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .StopWatch(true)
                       .Cache(true)
                       .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("pipe_1", 1);
                await Task.Delay(100);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                       .Label("exc 1")
                       .Add()
                       .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("pipe_2", 1);
                await Task.Delay(100);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                       .Label("exc 2")
                       .Add()
                       .Executor(subPipe)
                       .Label("sub_pipe")
                       .Add()
                       .Default((x, cache) =>
            {
                var sub1  = cache.GetSafely <int>("sub_1");
                var sub2  = cache.GetSafely <int>("sub_2");
                var sub3  = cache.GetSafely <int>("sub_3");
                var pipe1 = cache.GetSafely <int>("pipe_1");
                var pipe2 = cache.GetSafely <int>("pipe_2");

                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(sub1 + sub2 + sub3 + pipe1 + pipe2));
            })
                       .Add()
                       .Return((model, results) =>
            {
                var sum = results
                          .FirstOrDefault(x => x.Label == "Default").Value.Value;

                Assert.Contains(results, x => x.Label == "sub_pipe");
                Assert.Equal(5, sum);

                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(sum));
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, int> >(pipe);
            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(5, result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Elapsed < TimeSpan.FromSeconds(2));
        }
Example #8
0
        public async Task ParallelPipeExecuteWithIfAndDefault()
        {
            var pipe = PipeBuilder
                       .AsyncParallelPipe <IntModel, bool>()
                       .StopWatch(true)
                       .If(x => x.Integer == 0)
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 1")
                       .Add()
                       .If(x => x.Integer > 110) // in pipe, will not be executed
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 2")
                       .Add()
                       .EndIf()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 3")
                       .Add()
                       .If(false) //excluded from pipe, will not be executed
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 4")
                       .Add()
                       .EndIf()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 5")
                       .Add()
                       .EndIf()
                       .Default((x, cache) =>
            {
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Add()
                       .Return((model, results) =>
            {
                Assert.True(results.Length == 4);
                Assert.Contains(results, x => x.Label == "exc 1");
                Assert.Contains(results, x => x.Label == "exc 3");
                Assert.Contains(results, x => x.Label == "exc 5");
                Assert.Contains(results, x => x.Label == "Default");
                Assert.DoesNotContain(results, x => x.Label == "exc 2");
                Assert.DoesNotContain(results, x => x.Label == "exc 4");

                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, bool> >(pipe);
            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.True(result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Elapsed < TimeSpan.FromSeconds(2));
        }