public void ShouldDetectMissingBehaviorForRootContext()
        {
            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(RegisterStep.Create("Child", typeof(ChildBehaviorOfChildContext), "desc"))
                          .Build(typeof(IParentContext));

            var ex = Assert.Throws <Exception>(() => builder.Build());

            Assert.AreEqual("Can't find any behaviors/connectors for the root context (NServiceBus.Core.Tests.Pipeline.PipelineModelBuilderTests+IParentContext)", ex.Message);
        }
        public void ShouldOnlyAllowReplacementOfExistingRegistrations()
        {
            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(RegisterStep.Create("Root1", typeof(RootBehavior), "desc"))
                          .Replace(new ReplaceStep("DoesNotExist", typeof(RootBehavior), "desc"))
                          .Build(typeof(IParentContext));

            var ex = Assert.Throws <Exception>(() => builder.Build());

            Assert.AreEqual("Multiple replacements of the same pipeline behaviour is not supported. Make sure that you only register a single replacement for 'DoesNotExist'.", ex.Message);
        }
        public void ShouldDetectConflictingStepRegistrations()
        {
            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(RegisterStep.Create("Root1", typeof(RootBehavior), "desc"))
                          .Register(RegisterStep.Create("Root1", typeof(ChildBehaviorOfChildContextNotInheritedFromParentContext), "desc"))
                          .Build(typeof(IParentContext));

            var ex = Assert.Throws <Exception>(() => builder.Build());

            Assert.AreEqual("Step registration with id 'Root1' is already registered for 'NServiceBus.Core.Tests.Pipeline.PipelineModelBuilderTests+RootBehavior'.", ex.Message);
        }
        public void ShouldDetectConflictingStageConnectors()
        {
            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(RegisterStep.Create("Root1", typeof(RootBehavior), "desc"))
                          .Register(RegisterStep.Create("ParentContextToChildContextConnector", typeof(ParentContextToChildContextConnector), "desc"))
                          .Register(RegisterStep.Create("ParentContextToChildContextNotInheritedFromParentContextConnector", typeof(ParentContextToChildContextNotInheritedFromParentContextConnector), "desc"))
                          .Build(typeof(IParentContext));

            var ex = Assert.Throws <Exception>(() => builder.Build());

            Assert.AreEqual("Multiple stage connectors found for stage 'NServiceBus.Core.Tests.Pipeline.PipelineModelBuilderTests+IParentContext'. Remove one of: 'NServiceBus.Core.Tests.Pipeline.PipelineModelBuilderTests+ParentContextToChildContextConnector', 'NServiceBus.Core.Tests.Pipeline.PipelineModelBuilderTests+ParentContextToChildContextNotInheritedFromParentContextConnector'", ex.Message);
        }
        public void ShouldDetectRegistrationsWithContextsNotReachableFromTheRootContext()
        {
            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(RegisterStep.Create("Root", typeof(RootBehavior), "desc"))
                          .Register(RegisterStep.Create("ParentContextToChildContextConnector", typeof(ParentContextToChildContextConnector), "desc"))
                          .Register(RegisterStep.Create("Child", typeof(ChildBehaviorOfChildContextNotInheritedFromParentContext), "desc"))
                          .Build(typeof(IParentContext));

            var model = builder.Build();

            Assert.AreEqual(2, model.Count);
        }
        public void ShouldHandleTheTerminator()
        {
            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(RegisterStep.Create("Root1", typeof(RootBehavior), "desc"))
                          .Register(RegisterStep.Create("ParentContextToChildContextConnector", typeof(ParentContextToChildContextConnector), "desc"))
                          .Register(RegisterStep.Create("Child", typeof(ChildBehaviorOfChildContextNotInheritedFromParentContext), "desc"))
                          .Register(RegisterStep.Create("Terminator", typeof(Terminator), "desc"))
                          .Build(typeof(IParentContext));

            var model = builder.Build();

            Assert.AreEqual(3, model.Count);
        }
        public void ShouldAddWhenAddingOrReplacingABehaviorThatDoesntExist()
        {
            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(RegisterStep.Create("Root1", typeof(RootBehavior), "desc"))
                          .RegisterOrReplace(RegisterOrReplaceStep.Create("SomeBehaviorOfParentContext", typeof(SomeBehaviorOfParentContext), "desc"))
                          .Build(typeof(IParentContext));

            var model = builder.Build();

            Assert.That(model.Count, Is.EqualTo(2));
            var addedBehavior = model.FirstOrDefault(x => x.StepId == "SomeBehaviorOfParentContext");

            Assert.That(addedBehavior, Is.Not.Null);
            Assert.That(addedBehavior.BehaviorType, Is.EqualTo(typeof(SomeBehaviorOfParentContext)));
        }
        public void ShouldDetectNonExistingInsertAfterRegistrations()
        {
            var someBehaviorRegistration    = RegisterStep.Create("SomeBehaviorOfParentContext", typeof(SomeBehaviorOfParentContext), "desc");
            var anotherBehaviorRegistration = RegisterStep.Create("AnotherBehaviorOfParentContext", typeof(AnotherBehaviorOfParentContext), "desc");

            anotherBehaviorRegistration.InsertAfter("DoesNotExist");

            var builder = ConfigurePipelineModelBuilder.Setup()
                          .Register(someBehaviorRegistration)
                          .Register(anotherBehaviorRegistration)
                          .Build(typeof(IParentContext));

            var ex = Assert.Throws <Exception>(() => builder.Build());

            Assert.AreEqual("Registration 'DoesNotExist' specified in the insertafter of the 'AnotherBehaviorOfParentContext' step does not exist. Current StepIds: 'SomeBehaviorOfParentContext', 'AnotherBehaviorOfParentContext'", ex.Message);
        }