コード例 #1
0
        public virtual void testCannotRemoveScopeAndMoveToConcurrentActivity()
        {
            // given
            var sourceProcessDefinition =
                testHelper.DeployAndGetDefinition(ProcessModels.ParallelGatewaySubprocessProcess);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(ProcessModels.ParallelTaskAndSubprocessProcess);

            // when
            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("subProcess", "subProcess")
                .MapActivities("userTask1", "userTask1")
                .MapActivities("userTask2", "userTask2")
                .Build();

                Assert.Fail("should not validate");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask2",
                                        "The closest mapped ancestor 'subProcess' is mapped to scope 'subProcess' which is not an ancestor of target scope 'userTask2'");
            }
        }
コード例 #2
0
        public virtual void testCannotMigrateHorizontallyBetweenScopes()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.ParallelSubprocessProcess);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.ParallelSubprocessProcess);

            // when
            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("subProcess1", "subProcess1")
                .MapActivities("subProcess2", "subProcess2")
                .MapActivities("userTask1", "userTask2")
                .MapActivities("userTask2", "userTask1")
                .Build();

                Assert.Fail("should Assert.Fail");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask1",
                                        "The closest mapped ancestor 'subProcess1' is mapped to scope 'subProcess1' which is not an ancestor of target scope 'userTask2'")
                .HasInstructionFailures("userTask2",
                                        "The closest mapped ancestor 'subProcess2' is mapped to scope 'subProcess2' which is not an ancestor of target scope 'userTask1'");
            }
        }
コード例 #3
0
        public virtual void testCannotRemoveParentScopeAndMoveOutOfGrandParentScope()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.TripleSubprocessProcess);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.TripleSubprocessProcess);

            // when
            try
            {
                // subProcess2 is not migrated
                // subProcess 3 is moved out of the subProcess1 scope (by becoming a subProcess1 itself)
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("subProcess1", "subProcess1")
                .MapActivities("subProcess3", "subProcess1")
                .MapActivities("userTask", "userTask")
                .Build();

                Assert.Fail("should not validate");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("subProcess3",
                                        "The closest mapped ancestor 'subProcess1' is mapped to scope 'subProcess1' which is not an ancestor of target scope 'subProcess1'");
            }
        }
コード例 #4
0
        public virtual void testMigrateEventSubprocessChangeStartEventType()
        {
            // given
            var sourceProcessDefinition =
                testHelper.DeployAndGetDefinition(EventSubProcessModels.SIGNAL_EVENT_SUBPROCESS_PROCESS);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(EventSubProcessModels.TIMER_EVENT_SUBPROCESS_PROCESS);

            try
            {
                // when
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities(USER_TASK_ID, USER_TASK_ID)
                .MapActivities(EVENT_SUB_PROCESS_START_ID, EVENT_SUB_PROCESS_START_ID)
                .Build();
                Assert.Fail("exception expected");
            }
            catch (MigrationPlanValidationException e)
            {
                // then
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures(EVENT_SUB_PROCESS_START_ID,
                                        "Events are not of the same type (signalStartEvent != startTimerEvent)");
            }
        }
コード例 #5
0
        public virtual void testMapEqualActivitiesWithParallelMultiInstance()
        {
            // given
            IBpmnModelInstance testProcess = ModifiableBpmnModelInstance.Modify(ProcessModels.OneTaskProcess)
                                             //.GetBuilderForElementById("userTask", typeof(UserTaskBuilder))
                                             //.MultiInstance()
                                             //.Parallel()
                                             //.Cardinality("3")
                                             //.MultiInstanceDone()
                                             //.Done()
            ;
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(testProcess);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(testProcess);

            // when
            try
            {
                runtimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("userTask", "userTask")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask",
                                        "Target activity 'userTask' is a descendant of multi-instance body 'userTask#multiInstanceBody' " +
                                        "that is not mapped from the source process definition.");
            }
        }
コード例 #6
0
        public virtual void testMapBoundaryToChildActivity()
        {
            IBpmnModelInstance sourceProcess = ModifiableBpmnModelInstance.Modify(ProcessModels.SubprocessProcess)
                                               //.ActivityBuilder("subProcess")
                                               //.BoundaryEvent("boundary")
                                               ////.Message(MESSAGE_NAME)
                                               //.Done()
            ;
            IBpmnModelInstance targetProcess = ModifiableBpmnModelInstance.Modify(ProcessModels.SubprocessProcess)
                                               //.ActivityBuilder("userTask")
                                               //.BoundaryEvent("boundary")
                                               ////.Message(MESSAGE_NAME)
                                               //.Done()
            ;

            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(sourceProcess);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(targetProcess);

            try
            {
                runtimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("subProcess", "subProcess")
                .MapActivities("userTask", "userTask")
                .MapActivities("boundary", "boundary")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("boundary",
                                        "The source activity's event scope (subProcess) must be mapped to the target activity's event scope (userTask)");
            }
        }
コード例 #7
0
        public virtual void testNotMigrateBoundaryEventsOfDifferentType()
        {
            var sourceDefinition =
                testHelper.DeployAndGetDefinition(ModifiableBpmnModelInstance.Modify(ProcessModels.OneTaskProcess
                                                                                     //.ActivityBuilder("userTask")
                                                                                     //.BoundaryEvent("boundary")
                                                                                     ////.Message(MESSAGE_NAME)
                                                                                     //.Done()
                                                                                     ));
            var targetDefinition =
                testHelper.DeployAndGetDefinition(ModifiableBpmnModelInstance.Modify(ProcessModels.OneTaskProcess)
                                                  //.ActivityBuilder("userTask")
                                                  //.BoundaryEvent("boundary")
                                                  //.Signal(SIGNAL_NAME)
                                                  //.Done()
                                                  );

            try
            {
                runtimeService.CreateMigrationPlan(sourceDefinition.Id, targetDefinition.Id)
                .MapActivities("userTask", "userTask")
                .MapActivities("boundary", "boundary")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("boundary",
                                        "Events are not of the same type (boundaryMessage != boundarySignal)");
            }
        }
コード例 #8
0
        public virtual void testMigrateSubProcessToProcessDefinition()
        {
            var sourceDefinition = testHelper.DeployAndGetDefinition(ProcessModels.SubprocessProcess);
            var targetDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);

            try
            {
                runtimeService.CreateMigrationPlan(sourceDefinition.Id, targetDefinition.Id)
                .MapActivities("subProcess", targetDefinition.Id)
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("subProcess", "Target activity '" + targetDefinition.Id + "' does not exist");
            }
        }
コード例 #9
0
        /// <summary>
        /// Remove when implementing CAM-5407
        /// </summary>
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void testCannotRemoveScopeAndMoveToConcurrentActivity()
        public virtual void testCannotRemoveScopeAndMoveToConcurrentActivity()
        {
            // given
            ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.PARALLEL_GATEWAY_SUBPROCESS_PROCESS);
            ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.PARALLEL_TASK_AND_SUBPROCESS_PROCESS);

            // when
            try
            {
                rule.RuntimeService.createMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id).mapActivities("subProcess", "subProcess").mapActivities("userTask1", "userTask1").mapActivities("userTask2", "userTask2").build();

                Assert.fail("should not validate");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.assertThat(e.ValidationReport).hasInstructionFailures("userTask2", "The closest mapped ancestor 'subProcess' is mapped to scope 'subProcess' which is not an ancestor of target scope 'userTask2'");
            }
        }
コード例 #10
0
        public virtual void testMigrateNullTargetActivityId()
        {
            var sourceDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);
            var targetDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);

            try
            {
                runtimeService.CreateMigrationPlan(sourceDefinition.Id, targetDefinition.Id)
                .MapActivities("userTask", null)
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask", "Target activity id is null");
            }
        }
コード例 #11
0
        public virtual void testMigrateToUnsupportedActivityType()
        {
            var sourceDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);
            var targetDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneReceiveTaskProcess);

            try
            {
                runtimeService.CreateMigrationPlan(sourceDefinition.Id, targetDefinition.Id)
                .MapActivities("userTask", "receiveTask")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask",
                                        "Activities have incompatible types (UserTaskActivityBehavior is not compatible with ReceiveTaskActivityBehavior)");
            }
        }
コード例 #12
0
        public virtual void testCannotUpdateEventTriggerForNonEvent()
        {
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);

            try
            {
                runtimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("userTask", "userTask")
                .UpdateEventTrigger()
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask",
                                        "Cannot update event trigger because the activity does not define a persistent event trigger");
            }
        }
コード例 #13
0
        public virtual void testCannotRemoveParentScope()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(GatewayModels.PARALLEL_GW_IN_SUBPROCESS);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(GatewayModels.PARALLEL_GW);

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("join", "join")
                .Build();
                Assert.Fail("exception expected");
            }
            catch (MigrationPlanValidationException e)
            {
                // then
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("join", "The gateway's flow scope 'subProcess' must be mapped");
            }
        }
コード例 #14
0
        public virtual void testNotMapActivitiesMoreThanOnce()
        {
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.ParallelGatewayProcess);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.ParallelGatewayProcess);

            try
            {
                runtimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("userTask1", "userTask1")
                .MapActivities("userTask1", "userTask2")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask1",
                                        "There are multiple mappings for source activity id 'userTask1'",
                                        "There are multiple mappings for source activity id 'userTask1'");
            }
        }
コード例 #15
0
        public virtual void testCannotMapMultipleGatewaysToOne()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(GatewayModels.PARALLEL_GW);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(GatewayModels.PARALLEL_GW);

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("join", "join")
                .MapActivities("fork", "join")
                .Build();
                Assert.Fail("exception expected");
            }
            catch (MigrationPlanValidationException e)
            {
                // then
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("join", "Only one gateway can be mapped to gateway 'join'");
            }
        }
コード例 #16
0
        public virtual void testAddMultiInstanceBody()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(MultiInstanceProcessModels.PAR_MI_ONE_TASK_PROCESS);

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("userTask", "userTask")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask",
                                        "Target activity 'userTask' is a descendant of multi-instance body 'userTask#multiInstanceBody' " +
                                        "that is not mapped from the source process definition");
            }
        }
コード例 #17
0
        public virtual void testNotMigrateActivitiesOfDifferentType()
        {
            var sourceDefinition = testHelper.DeployAndGetDefinition(ProcessModels.OneTaskProcess);
            var targetDefinition =
                testHelper.DeployAndGetDefinition(ModifiableBpmnModelInstance.Modify(ProcessModels.SubprocessProcess)
                                                  .SwapElementIds("userTask", "subProcess"));

            try
            {
                runtimeService.CreateMigrationPlan(sourceDefinition.Id, targetDefinition.Id)
                .MapActivities("userTask", "userTask")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("userTask",
                                        "Activities have incompatible types (UserTaskActivityBehavior is not " +
                                        "compatible with SubProcessActivityBehavior)");
            }
        }
コード例 #18
0
        public virtual void cannotMigrateFromExternalToClassDelegateServiceTask()
        {
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(ExternalTaskModels.ONE_EXTERNAL_TASK_PROCESS);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(ServiceTaskModels.oneClassDelegateServiceTask("foo.Bar"));

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("externalTask", "serviceTask")
                .Build();
                Assert.Fail("exception expected");
            }
            catch (MigrationPlanValidationException e)
            {
                // then
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("externalTask",
                                        "Activities have incompatible types (ExternalTaskActivityBehavior is not compatible with" +
                                        " ClassDelegateActivityBehavior)");
            }
        }
コード例 #19
0
        public virtual void testCannotMigrateInclusiveToParallelGateway()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(GatewayModels.INCLUSIVE_GW);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(GatewayModels.PARALLEL_GW);

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("join", "join")
                .Build();
                Assert.Fail("exception expected");
            }
            catch (MigrationPlanValidationException e)
            {
                // then
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("join",
                                        "Activities have incompatible types " +
                                        "(InclusiveGatewayActivityBehavior is not compatible with ParallelGatewayActivityBehavior)");
            }
        }
コード例 #20
0
        public virtual void testCannotAddScopeOnTopOfEventSubProcess()
        {
            // given
            var sourceProcessDefinition =
                testHelper.DeployAndGetDefinition(CompensationModels.COMPENSATION_EVENT_SUBPROCESS_MODEL);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(
                    ModifiableBpmnModelInstance.Modify(CompensationModels.DOUBLE_SUBPROCESS_MODEL)
                    .AddSubProcessTo("innerSubProcess")
                    //.Id("eventSubProcess")
                    .TriggerByEvent()
                    //.EmbeddedSubProcess()
                    //.StartEvent("eventSubProcessStart")
                    //.CompensateEventDefinition()
                    //.CompensateEventDefinitionDone()
                    .EndEvent()
                    .Done());


            try
            {
                // when
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("subProcess", "outerSubProcess")
                .MapActivities("eventSubProcessStart", "eventSubProcessStart")
                .MapActivities("compensationBoundary", "compensationBoundary")
                .MapActivities("userTask2", "userTask2")
                .Build();
                Assert.Fail("exception expected");
            }
            catch (MigrationPlanValidationException e)
            {
                // then
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("eventSubProcessStart",
                                        "The source activity's event scope (subProcess) must be mapped to the target activity's event scope (innerSubProcess)");
            }
        }
コード例 #21
0
        public virtual void testMigrateSequentialMiBodyAddSubprocess()
        {
            // given
            var sourceProcessDefinition =
                testHelper.DeployAndGetDefinition(MultiInstanceProcessModels.SEQ_MI_ONE_TASK_PROCESS);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(MultiInstanceProcessModels.SEQ_MI_SUBPROCESS_PROCESS);

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities(miBodyOf("userTask"), miBodyOf("subProcess"))
                .MapActivities("userTask", "userTask")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures(miBodyOf("userTask"),
                                        "Must map the inner activity of a multi-instance body when the body is mapped");
            }
        }
コード例 #22
0
        public virtual void testCannotRemoveGatewayIncomingSequenceFlow()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(GatewayModels.PARALLEL_GW);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(ModifiableBpmnModelInstance.Modify(GatewayModels.PARALLEL_GW)
                                                  .RemoveFlowNode("parallel2"));

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("join", "join")
                .Build();
                Assert.Fail("exception expected");
            }
            catch (MigrationPlanValidationException e)
            {
                // then
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("join",
                                        "The target gateway must have at least the same number of incoming sequence flows that the source gateway has");
            }
        }
コード例 #23
0
        public virtual void testCannotFlipAncestorScopes()
        {
            // given
            var sourceProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.DoubleSubprocessProcess);
            var targetProcessDefinition = testHelper.DeployAndGetDefinition(ProcessModels.DoubleSubprocessProcess);

            // when
            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities("outerSubProcess", "innerSubProcess")
                .MapActivities("innerSubProcess", "outerSubProcess")
                .MapActivities("userTask", "userTask")
                .Build();

                Assert.Fail("should not validate");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures("innerSubProcess",
                                        "The closest mapped ancestor 'outerSubProcess' is mapped to scope 'innerSubProcess' which is not an ancestor of target scope 'outerSubProcess'");
            }
        }
コード例 #24
0
        public virtual void testMigrateParallelToSequential()
        {
            // given
            var sourceProcessDefinition =
                testHelper.DeployAndGetDefinition(MultiInstanceProcessModels.PAR_MI_ONE_TASK_PROCESS);
            var targetProcessDefinition =
                testHelper.DeployAndGetDefinition(MultiInstanceProcessModels.SEQ_MI_ONE_TASK_PROCESS);

            try
            {
                rule.RuntimeService.CreateMigrationPlan(sourceProcessDefinition.Id, targetProcessDefinition.Id)
                .MapActivities(miBodyOf("userTask"), miBodyOf("userTask"))
                .MapActivities("userTask", "userTask")
                .Build();
                Assert.Fail("Should not succeed");
            }
            catch (MigrationPlanValidationException e)
            {
                MigrationPlanValidationReportAssert.That(e.ValidationReport)
                .HasInstructionFailures(miBodyOf("userTask"),
                                        "Activities have incompatible types (ParallelMultiInstanceActivityBehavior is not " +
                                        "compatible with SequentialMultiInstanceActivityBehavior)");
            }
        }