public virtual void TestBoundaryEvent()
        {
            var verifier = new ActivityInstanceVerification();

            IPvmProcessDefinition processDefinition =
                new ProcessDefinitionBuilder().CreateActivity("start")
                .Initial()
                .Behavior(new Automatic())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("userTask")
                .EndActivity()
                .CreateActivity("userTask")
                .Scope()
                .Behavior(new EmbeddedSubProcess())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("end1")
                .EndActivity()
                .CreateActivity("timer")
                .Behavior(new WaitState())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .AttachedTo("userTask", true)
                .Transition("end2")
                .EndActivity()
                .CreateActivity("end1")
                .Behavior(new End())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .EndActivity()
                .CreateActivity("end2")
                .Behavior(new End())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .EndActivity()
                .BuildProcessDefinition();

            var processInstance = processDefinition.CreateProcessInstance();

            processInstance.Start();

            var userTaskExecution = processInstance.FindExecution("userTask");

            ((PvmExecutionImpl)userTaskExecution).ExecuteActivity(processDefinition.FindActivity("timer"));

            var timerExecution = processInstance.FindExecution("timer");

            timerExecution.Signal(null, null);

            verifier.AssertNonCompletingActivityInstance("start", 1);
            verifier.AssertNonCompletingActivityInstance("userTask", 1);
            verifier.AssertIsCompletingActivityInstance("end2", 1);
        }
        public virtual void TestSingleEndAfterParallelJoin()
        {
            var verifier = new ActivityInstanceVerification();

            IPvmProcessDefinition processDefinition =
                new ProcessDefinitionBuilder().CreateActivity("start")
                .Initial()
                .Behavior(new Automatic())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("fork")
                .EndActivity()
                .CreateActivity("fork")
                .Behavior(new ParallelGateway())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("a1")
                .Transition("a2")
                .EndActivity()
                .CreateActivity("a1")
                .Behavior(new Automatic())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("join")
                .EndActivity()
                .CreateActivity("a2")
                .Behavior(new Automatic())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("join")
                .EndActivity()
                .CreateActivity("join")
                .Behavior(new ParallelGateway())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("end")
                .EndActivity()
                .CreateActivity("end")
                .Behavior(new End())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .EndActivity()
                .BuildProcessDefinition();

            IPvmProcessInstance processInstance = processDefinition.CreateProcessInstance();

            processInstance.Start();

            verifier.AssertNonCompletingActivityInstance("start", 1);
            verifier.AssertNonCompletingActivityInstance("fork", 1);
            verifier.AssertNonCompletingActivityInstance("a1", 1);
            verifier.AssertNonCompletingActivityInstance("a2", 1);
            verifier.AssertNonCompletingActivityInstance("join", 2);
            verifier.AssertIsCompletingActivityInstance("end", 1);
        }
        public virtual void TestSimpleSubProcess()
        {
            var verifier = new ActivityInstanceVerification();

            IPvmProcessDefinition processDefinition =
                new ProcessDefinitionBuilder().CreateActivity("start")
                .Initial()
                .Behavior(new Automatic())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("embeddedsubprocess")
                .EndActivity()
                .CreateActivity("embeddedsubprocess")
                .Scope()
                .Behavior(new EmbeddedSubProcess())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .CreateActivity("startInside")
                .Behavior(new Automatic())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .Transition("endInside")
                .EndActivity()
                .CreateActivity("endInside")
                .Behavior(new End())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .EndActivity()
                .Transition("end")
                .EndActivity()
                .CreateActivity("end")
                .Behavior(new End())
                .ExecutionListener(ExecutionListenerFields.EventNameEnd, verifier)
                .EndActivity()
                .BuildProcessDefinition();

            IPvmProcessInstance processInstance = processDefinition.CreateProcessInstance();

            processInstance.Start();

            verifier.AssertNonCompletingActivityInstance("start", 1);
            verifier.AssertNonCompletingActivityInstance("embeddedsubprocess", 1);
            verifier.AssertNonCompletingActivityInstance("startInside", 1);
            verifier.AssertIsCompletingActivityInstance("endInside", 1);
            verifier.AssertIsCompletingActivityInstance("end", 1);
        }