Пример #1
0
        public void Adding_ShouldExecute_To_Subflow_Applies_To_Subflow_Root()
        {
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow2")
            .AddRoot <PipelineNode <object> >()
            .AddChild <ITestNode4>()
            .AddChild <ITestNode3>()
            .AddChild <ITestNode2>();

            flowBuilder.Register();

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <PipelineNode <object> >()
            .AddChild <ITestNode2>()
            .AddFlow("TestFlow2")
            .ForChildFlow("TestFlow2").SetShouldExecute(ctxt => Task.FromResult(1 + 1 == 3));

            flowBuilder.Register();

            var container = containerBuilder.Build();

            var factory = container.Resolve <INodeFactory <object> >();

            var flow = (IPipelineNode <object>)factory.BuildFlow("TestFlow1");

            var subflowRoot = (IPipelineNode <object>)flow.Children[1];

            subflowRoot.ShouldExecuteFunc.Should().NotBeNull();
            subflowRoot.ShouldExecuteFunc(new ExecutionContext <object>(new object())).Result.Should().BeFalse();
        }
Пример #2
0
        public void Multiple_Flows_Can_Be_Registered()
        {
            var kernel = new StandardKernel();

            kernel.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new NinjectFlowRegistrar(kernel));

            flowBuilder.CreateFlow("TestFlow2")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode4>()
            .AddChild <ITestNode3>()
            .AddChild <ITestNode2>();

            flowBuilder.Register();

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>();

            flowBuilder.Register();

            var factory = kernel.Get <INodeFactory <object> >();

            var flow = factory.BuildFlow("TestFlow1");

            flow.Should().NotBeNull();

            flow = factory.BuildFlow("TestFlow2");
            flow.Should().NotBeNull();
        }
Пример #3
0
        public async Task SimpleFlowElementCanExecuteErrorShouldNotExecuteSecondStep()
        {
            var flow = new FlowBuilder()
                       .Add(
                FlowElementBuilder
                .New()
                .CanExecute(async(i, _) => CanExecuteResult.Error("error"))
                .OnExecute(async(i, _) => throw new Exception("Should not execute step 1"))
                .Build()
                ,
                FlowElementBuilder
                .New()
                .CanExecute(async(i, _) => CanExecuteResult.Continue)
                .OnExecute(async(i, _) => throw new Exception("Should not execute step 2"))
                .Build()
                )
                       .Build();

            var flowResult = await flow.RunAsync(4);

            flowResult
            .Should()
            .BeOfType <FlowErrorResult>()
            .Which.ErrorObject
            .Should().Be("error");
        }
Пример #4
0
        public void ShouldExecute_Is_Added_To_Child_Node()
        {
            var kernel = new StandardKernel();

            kernel.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new NinjectFlowRegistrar(kernel));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>()
            .ForChild <ITestNode2>()
            .SetShouldExecute(ctxt => Task.FromResult(1 + 1 == 3));

            flowBuilder.Register();

            var factory = kernel.Get <INodeFactory <object> >();

            var flow = (IPipelineNode <object>)factory.BuildFlow("TestFlow1");

            var subflow = flow.Children[0];

            subflow.ShouldExecuteFunc.ShouldNotBeNull();
            subflow.ShouldExecuteFunc(new ExecutionContext <object>(new object())).Result.ShouldBeFalse();
        }
Пример #5
0
        protected override void Build(FlowBuilder builder)
        {
            builder.WithDefaultFaultHandler <MyFaultHandler>();
            builder.WithDefaultCancellationHandler <MyCancellationHandler>();

            builder.WithInitialNode(builder.Activity <ThrowServiceClient>("ThrowService client"));
        }
Пример #6
0
        public async Task ExecutePipeSuccess()
        {
            var element = new Mock <FlowElement>();

            element
            .Protected()
            .Setup <Task <CanExecuteResult> >("OnCanExecuteAsync", ItExpr.IsAny <string>(), ItExpr.IsAny <FlowState>())
            .ReturnsAsync(true);
            element
            .Protected()
            .Setup <Task <FlowElementResult> >("OnExecuteAsync", ItExpr.IsAny <string>(), ItExpr.IsAny <FlowState>())
            .ReturnsAsync(new FlowSuccessResult()
            {
                Result = "res"
            });

            var builder = new FlowBuilder()
                          .Add(element.Object);

            var pipeline = builder.Build();

            var result = await pipeline.RunAsync("test");

            result.Result.Should().Be("res");
        }
Пример #7
0
        public void Multiple_Flows_Can_Be_Registered()
        {
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow2")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode4>()
            .AddChild <ITestNode3>()
            .AddChild <ITestNode2>();

            flowBuilder.Register();

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>();

            flowBuilder.Register();

            var container = containerBuilder.Build();

            var factory = container.Resolve <INodeFactory <object> >();

            var flow = factory.BuildFlow("TestFlow1");

            flow.ShouldNotBeNull();

            flow = factory.BuildFlow("TestFlow2");
            flow.ShouldNotBeNull();
        }
Пример #8
0
        static void Run()
        {
            var flow = new FlowBuilder();

            flow

            .Validate(() => true)
            .Condition("StepName", () => expression())
            .That()
            .If()
            .ExecuteInLessThan(5)
            .And()
            .Return(ConditionState.True)
            .Then()
            .ReportSuccess()
            .Else()
            .ReportFailure()
            .OnSuccess()
            .OnFailure()
            .Continiue()
            .Retry()
            .WarnAndRetry()
            .WarnAndContiniue()
            .Abord()
            .OnException().OfType().Continiue()
            .OnException().Any().Abord()
            .ValidateThat()
            .....
            ;
        }
Пример #9
0
        public void Simple_Flow_Is_Serialized_With_Full_Abbreviations()
        {
            TypeAbbreviationCache.RegisterFromAssembly(GetType().Assembly, true, false);

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>();

            var rootComponent = flowBuilder.RootComponent;

            var serializer = new JsonComponentSerializer();

            var definition = serializer.Serialize(rootComponent);

            _testOutputHelper.WriteLine(definition);

            definition.Should().NotBeNullOrEmpty();
            definition.Should().Contain("Banzai.Serialization.SystemJson.Test");
        }
Пример #10
0
        public void Simple_Flow_Contains_All_Nodes()
        {
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <PipelineNode <object> >()
            .AddChild <ITestNode2>()
            .AddChild <IPipelineNode <object> >()
            .ForLastChild()
            .AddChild <ITestNode4>()
            .AddChild <ITestNode3>()
            .AddChild <ITestNode2>()
            .ForParent()
            .AddChild <ITestNode3>();

            flowBuilder.Register();

            var container = containerBuilder.Build();

            var factory = container.Resolve <INodeFactory <object> >();

            var flow = (IPipelineNode <object>)factory.BuildFlow("TestFlow1");

            flow.ShouldBeType <PipelineNode <object> >();
            flow.Children.Count.ShouldEqual(3);
            var subflow = (IPipelineNode <object>)flow.Children[1];

            subflow.Children.Count.ShouldEqual(3);
            subflow.Children[1].ShouldBeType <TestNode3>();
        }
Пример #11
0
        public void Simple_Flow_Is_Deserialized()
        {
            TypeAbbreviationCache.RegisterFromAssembly(GetType().Assembly, failOnCollision: false);

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>();

            var rootComponent = flowBuilder.RootComponent;

            var serializer = new JsonComponentSerializer();

            var definition = serializer.Serialize(rootComponent);

            var deserializedComponent = serializer.Deserialize <object>(definition);

            deserializedComponent.Should().NotBeNull();

            deserializedComponent.Children[0].Children.Count.Should().Be(1);
        }
Пример #12
0
        public void Simple_Flow_With_ShouldExecuteJavaScript_Is_Deserialized()
        {
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestJsNode>()
            .AddChild <ITestNode2>()
            .ForChild <ITestJsNode>()
            .SetShouldExecuteJavaScript("var x = 1;");

            var rootComponent = flowBuilder.RootComponent;

            var serializer = new JsonComponentSerializer();

            var definition = serializer.Serialize(rootComponent);

            FlowComponent <object> deserializedComponent = serializer.Deserialize <object>(definition);

            deserializedComponent.ShouldNotBeNull();

            var pipelineComponent = deserializedComponent.Children[0];

            pipelineComponent.Children.Count.ShouldEqual(2);

            var jsNode = pipelineComponent.Children[0];

            jsNode.GetShouldExecuteJavaScript().ShouldEqual("var x = 1;");
        }
Пример #13
0
 static void Run(){
     
     var flow = new FlowBuilder();
     
     flow
         
         .Validate(() => true)
             .Condition("StepName", () => expression())
             .That()
                 .If()
                     .ExecuteInLessThan(5)
                     .And()
                     .Return(ConditionState.True)
                 .Then()
                     .ReportSuccess()
                 .Else()
                     .ReportFailure()
             .OnSuccess()
             .OnFailure()
                 .Continiue()
                 .Retry()
                 .WarnAndRetry()
                 .WarnAndContiniue()
                 .Abord()   
             .OnException().OfType().Continiue()
             .OnException().Any().Abord()
          .ValidateThat()          
          ..... 
        ;             
                 
 }
Пример #14
0
        public void CheckFlowWithSwitch()
        {
            // Arrange
            var b = new FlowBuilder();

            var s  = b.SwitchOf <int>();
            var a1 = b.DummyActivity();
            var a2 = b.DummyActivity();
            var a3 = b.DummyActivity();

            b.WithInitialNode(s);
            s.ConnectCase(0).To(a1);
            s.ConnectCase(1).To(a2);
            s.ConnectDefaultTo(a3);

            var e = b.DummyActivity();

            var validator = new ReachabilityValidator();

            // Act
            validator.Validate(b.CreateFlow());
            var result = validator.Result;

            // Assert
            Assert.That(result.GetErrorsOf(s), Is.Empty);
            Assert.That(result.GetErrorsOf(a1), Is.Empty);
            Assert.That(result.GetErrorsOf(a2), Is.Empty);
            Assert.That(result.GetErrorsOf(a3), Is.Empty);
            Assert.That(result.GetErrorsOf(e), Is.Not.Empty);
        }
        public void Adding_ShouldExecute_To_Subflow_Applies_To_Subflow_Root()
        {
            var kernel = new StandardKernel();

            kernel.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new NinjectFlowRegistrar(kernel));

            flowBuilder.CreateFlow("TestFlow2")
            .AddRoot <PipelineNode <object> >()
            .AddChild <ITestNode4>()
            .AddChild <ITestNode3>()
            .AddChild <ITestNode2>();

            flowBuilder.Register();

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <PipelineNode <object> >()
            .AddChild <ITestNode2>()
            .AddFlow("TestFlow2")
            .ForChildFlow("TestFlow2").SetShouldExecuteBlock <ShouldNotExecuteTestBlock>();

            flowBuilder.Register();

            var factory = kernel.Get <INodeFactory <object> >();

            var flow = (IPipelineNode <object>)factory.BuildFlow("TestFlow1");

            var subflowRoot = (IPipelineNode <object>)flow.Children[1];

            subflowRoot.ShouldExecuteBlock.ShouldNotBeNull();
            ((IShouldExecuteBlock <object>)subflowRoot.ShouldExecuteBlock).ShouldExecuteAsync(new ExecutionContext <object>(new object())).Result.ShouldBeFalse();
        }
Пример #16
0
        public void ShouldExecute_Is_Added_To_Child_Node()
        {
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>()
            .ForChild <ITestNode2>()
            .SetShouldExecuteBlock <ShouldNotExecuteTestBlock>();

            flowBuilder.Register();

            var container = containerBuilder.Build();

            var factory = container.Resolve <INodeFactory <object> >();

            var flow = (IPipelineNode <object>)factory.BuildFlow("TestFlow1");

            var subflow = flow.Children[0];

            subflow.ShouldExecuteBlock.ShouldNotBeNull();
            ((IShouldExecuteBlock <object>)subflow.ShouldExecuteBlock).ShouldExecuteAsync(new ExecutionContext <object>(new object())).Result.ShouldBeFalse();
        }
Пример #17
0
        public void Flow_With_ShouldExecuteBlock_Is_Serialized_With_Abbreviations()
        {
            TypeAbbreviationCache.RegisterFromAssembly(GetType().Assembly, failOnCollision: false);

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >().SetShouldExecuteBlock <ShouldNotExecuteTestBlock>()
            .AddChild <ITestJsNode>()
            .AddChild <ITestNode2>();

            var rootComponent = flowBuilder.RootComponent;

            var serializer = new JsonComponentSerializer();

            var definition = serializer.Serialize(rootComponent);

            Console.WriteLine(definition);

            definition.ShouldNotBeNull().ShouldNotBeEmpty();
            definition.ShouldContain("\"ShouldExecuteBlockType\":\"ShouldNotExecuteTestBlock\"");
        }
Пример #18
0
        public void Flow_Is_Built_With_NodeFactory_And_Json_Serializer()
        {
            Json.Registrar.RegisterAsDefault();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var container = containerBuilder.Build();

            var factory = container.Resolve <INodeFactory <object> >();

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>();

            var component = flowBuilder.RootComponent;

            var serialized = SerializerProvider.Serializer.Serialize(component);

            var flow = factory.BuildSerializedFlow(serialized);

            flow.FlowId.ShouldEqual("TestFlow1");
            flow.Id.ShouldEqual("Banzai.Autofac.Test.TestPipelineNode1");
            ((IMultiNode <object>)flow).Children[0].Id.ShouldEqual("Banzai.Autofac.Test.TestNode2");
        }
Пример #19
0
        public void Flow_With_ShouldExecuteBlock_Is_Deserialized()
        {
            TypeAbbreviationCache.RegisterFromAssembly(GetType().Assembly, failOnCollision: false);

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >().SetShouldExecuteBlock <ShouldNotExecuteTestBlock>()
            .AddChild <ITestJsNode>()
            .AddChild <ITestNode2>();

            var rootComponent = flowBuilder.RootComponent;

            var serializer = new JsonComponentSerializer();

            var definition = serializer.Serialize(rootComponent);

            FlowComponent <object> deserializedComponent = serializer.Deserialize <object>(definition);

            deserializedComponent.ShouldNotBeNull();

            deserializedComponent.Children[0].ShouldExecuteBlockType.ShouldEqual(typeof(ShouldNotExecuteTestBlock));
        }
Пример #20
0
        public async Task ExecuteQueryTaskOnEmptyResultReturnError()
        {
            var factory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider);

            var db = await factory.OpenDbConnectionAsync();

            db.CreateTable <Person>();

            var pipeline = new FlowBuilder()
                           .Add(
                DataFlowElementBuilder.New()
                .SetConnection(db)
                .Read <Person>()
                .Query(args => args.Expression.Where(p => p.Id == (int)args.PipeArgs))
                .OnEmptyOrNullRaiseError()
                .List()
                .Build()
                ).Build();

            var result = await pipeline.RunAsync(2);

            result.Should()
            .BeOfType <FlowErrorResult>()
            .Which.ErrorObject.Should().Be("no results found");
        }
Пример #21
0
        public void Simple_Flow_Is_Serialized_With_Full_Abbreviations()
        {
            TypeAbbreviationCache.Clear();
            TypeAbbreviationCache.RegisterFromAssembly(GetType().Assembly, useFullName: true, failOnCollision: false);

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestJsNode>()
            .AddChild <ITestNode2>();

            var rootComponent = flowBuilder.RootComponent;

            var serializer = new JsonComponentSerializer();

            var definition = serializer.Serialize(rootComponent);

            Console.WriteLine(definition);

            definition.ShouldNotBeNull().ShouldNotBeEmpty();
            definition.ShouldContain("Banzai.Json.Test");
        }
Пример #22
0
        public async Task FlowDeleteById()
        {
            var factory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider);

            var db = await factory.OpenDbConnectionAsync();

            db.CreateTable <Person>();
            db.Save(new Person()
            {
                Name = "Mario"
            });

            var flow = new FlowBuilder()
                       .Add(
                DataFlowElementBuilder.New()
                .SetConnection(db)
                .Delete <Person>()
                .DeleteById(i => i)
                .Build()
                ).Build();

            await flow.RunAsync(1);

            var persons = await db.SelectAsync <Person>();

            persons.Should().BeEmpty();
        }
Пример #23
0
        public async Task PerformanceTest()
        {
            ServiceProvider = SetupServices();

            var flowBuilder = new FlowBuilder <TestContext>();

            flowBuilder.Use <IncrementByOneMiddleware>();
            flowBuilder.Use <MultiplyByFiveMiddleware>();
            flowBuilder.Use <IncrementByOneMiddleware>();
            flowBuilder.Use <MultiplyByFiveMiddleware>();
            flowBuilder.Use <IncrementByOneMiddleware>();
            flowBuilder.Use <MultiplyByFiveMiddleware>();

            var flow    = flowBuilder.Build();
            var context = new TestContext {
                N = 0
            };

            var stopwatch = new Stopwatch();

            stopwatch.Start();
            for (var i = 0; i < 10000; i++)
            {
                await flow.InvokeAsync(context, ServiceProvider);
            }
            stopwatch.Stop();
            Assert.Pass($"Total: {stopwatch.ElapsedMilliseconds}, avg: {stopwatch.ElapsedMilliseconds/10000d}");
        }
Пример #24
0
        public async Task SimpleFlowElementMapOnError()
        {
            var flow = new FlowBuilder()
                       .Add(
                FlowElementBuilder
                .New()
                .CanExecuteContinue()
                .OnExecute(async(_, _) => new FlowErrorResult()
            {
                ErrorObject = "failed"
            })
                .Build()
                .MapOnError(async(_, _, _) => 42)
                )
                       .Build();

            var flowResult = await flow.RunAsync(4);

            flowResult
            .Should()
            .BeOfType <FlowSuccessResult>()
            .Which.Result
            .Should()
            .Be(42);
        }
Пример #25
0
        public async Task StoppingMiddlewareTest()
        {
            ServiceProvider = SetupServices();

            var flowBuilder = new FlowBuilder <TestContext>();

            flowBuilder.Use(typeof(MultiplyByFiveMiddleware));
            flowBuilder.Use <StopMiddleware>();
            flowBuilder.Use <IncrementByOneMiddleware>();

            var flow = flowBuilder.Build();

            var context = new TestContext {
                N = 5
            };
            await flow.InvokeAsync(context, ServiceProvider);

            Assert.AreEqual(5 * 5, context.N);

            VerifyCreated(true, typeof(MultiplyByFiveMiddleware), typeof(StopMiddleware));
            VerifyReleased(true, typeof(MultiplyByFiveMiddleware), typeof(StopMiddleware));

            VerifyCreated(false, typeof(IncrementByOneMiddleware));
            VerifyReleased(false, typeof(IncrementByOneMiddleware));
        }
Пример #26
0
        public void Flow_Builder_Is_Hydrated_And_Flow_Built_From_Json_Serializer()
        {
            Json.Registrar.RegisterAsDefault();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var container   = containerBuilder.Build();
            var factory     = container.Resolve <INodeFactory <object> >();
            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>();

            var serialized = flowBuilder.SerializeRootComponent();

            Console.WriteLine(serialized);


            var component = flowBuilder.DeserializeAndSetRootComponent(serialized);

            var flow = factory.BuildFlow(component);

            flow.FlowId.Should().Be("TestFlow1");
            flow.Id.Should().Be("Banzai.Autofac.Test.TestPipelineNode1");
            ((IMultiNode <object>)flow).Children[0].Id.Should().Be("Banzai.Autofac.Test.TestNode2");
        }
Пример #27
0
        public void ThrowingMiddlewareTest()
        {
            ServiceProvider = SetupServices();

            var flowBuilder = new FlowBuilder <TestContext>();

            flowBuilder.Use <MultiplyByFiveMiddleware>();
            flowBuilder.Use <ThrowingMiddleware>();
            flowBuilder.Use <IncrementByOneMiddleware>();

            var flow = flowBuilder.Build();

            var context = new TestContext {
                N = 5
            };
            var exception = Assert.ThrowsAsync <MiddlewareException <TestContext> >(() => flow.InvokeAsync(context, ServiceProvider));

            Assert.AreEqual(ServiceProvider.GetService(typeof(ThrowingMiddleware)), exception.Middleware);
            Assert.AreSame(context, exception.Context);
            Assert.AreEqual(5 * 5, context.N);

            VerifyCreated(true, typeof(MultiplyByFiveMiddleware), typeof(ThrowingMiddleware));
            VerifyReleased(true, typeof(MultiplyByFiveMiddleware), typeof(ThrowingMiddleware));

            VerifyCreated(false, typeof(IncrementByOneMiddleware));
            VerifyReleased(false, typeof(IncrementByOneMiddleware));
        }
Пример #28
0
        public async Task ShouldExecuteAsync_Is_Added_To_Child_Node()
        {
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new AutofacFlowRegistrar(containerBuilder));

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <IPipelineNode <object> >()
            .AddChild <ITestNode2>()
            .ForChild <ITestNode2>().SetShouldExecute(ctxt => Task.FromResult(1 + 1 != 2));

            flowBuilder.Register();

            var container = containerBuilder.Build();

            var factory = container.Resolve <INodeFactory <object> >();

            var flow = (IPipelineNode <object>)factory.BuildFlow("TestFlow1");

            var subflow = flow.Children[0];

            subflow.ShouldExecuteFunc.Should().NotBeNull();
            (await subflow.ShouldExecuteFunc(new ExecutionContext <object>(new object()))).Should().BeFalse();
        }
Пример #29
0
        protected override void Build(FlowBuilder builder)
        {
            builder.WithDefaultFaultHandler <MyFaultHandler>();
            builder.WithDefaultCancellationHandler <MyCancellationHandler>();

            var forkJoin = builder.ForkJoin("My fork join node");

            var first = forkJoin.Fork <DelayedIncrementActivity>("First fork");

            first.Bind(a => a.X).To(A);

            var second = forkJoin.Fork <DelayedIncrementActivity>("Second fork");

            second.Bind(a => a.X).To(B);

            var third = forkJoin.Fork <DelayedIncrementActivity>("Third fork");

            third.Bind(a => a.X).To(C);

            var sum = builder.Activity <SumActivity>("Sum action");

            sum.Bind(x => x.A).ToResultOf(first);
            sum.Bind(x => x.B).ToResultOf(second);
            sum.Bind(x => x.C).ToResultOf(third);

            builder.WithInitialNode(forkJoin);

            forkJoin.ConnectTo(sum);
        }
Пример #30
0
        public void Simple_Flow_Contains_Subflow()
        {
            var kernel = new StandardKernel();

            kernel.RegisterBanzaiNodes(GetType().Assembly, true);

            var flowBuilder = new FlowBuilder <object>(new NinjectFlowRegistrar(kernel));

            flowBuilder.CreateFlow("TestFlow2")
            .AddRoot <PipelineNode <object> >()
            .AddChild <ITestNode4>()
            .AddChild <ITestNode3>()
            .AddChild <ITestNode2>();

            flowBuilder.Register();

            flowBuilder.CreateFlow("TestFlow1")
            .AddRoot <PipelineNode <object> >()
            .AddChild <ITestNode2>()
            .AddFlow("TestFlow2");

            flowBuilder.Register();

            var factory = kernel.Get <INodeFactory <object> >();

            var flow = (IPipelineNode <object>)factory.BuildFlow("TestFlow1");

            flow.Should().BeOfType <PipelineNode <object> >();
            flow.Children.Count.Should().Be(2);
            var subflow = (IPipelineNode <object>)flow.Children[1];

            subflow.Children.Count.Should().Be(3);
            subflow.Children[1].Should().BeOfType <TestNode3>();
        }
Пример #31
0
        public void CheckFlowWithBlock()
        {
            // Arrange
            var b = new FlowBuilder();

            IFlowNode a = null;
            IFlowNode e = null;

            var block = b.Block("test", (_, builder) =>
            {
                a = builder.DummyActivity();
                e = builder.DummyActivity();
            });

            b.WithInitialNode(block);

            var validator = new ReachabilityValidator();

            // Act
            validator.Validate(b.CreateFlow());
            var result = validator.Result;

            // Assert
            Assert.That(result.GetErrorsOf(block), Is.Empty);
            Assert.That(result.GetErrorsOf(a), Is.Empty);
            Assert.That(result.GetErrorsOf(e), Is.Not.Empty);
        }