}
@Deployment
public void testTwoSubProcessInParallelWithinSubProcess() {
ProcessInstance pi = runtimeService.startProcessInstanceByKey("twoSubProcessInParallelWithinSubProcess");
TaskQuery taskQuery = taskService
.createTaskQuery()
.processInstanceId(pi.getId())
.orderByTaskName()
.asc();
List<Task> tasks = taskQuery.list();
// After process start, both tasks in the subprocesses should be active
Task taskA = tasks.get(0);
Task taskB = tasks.get(1);
assertEquals("Task in subprocess A", taskA.getName());
assertEquals("Task in subprocess B", taskB.getName());
// validate activity instance tree
ActivityInstance rootActivityInstance = runtimeService.getActivityInstance(pi.getProcessInstanceId());
assertEquals(pi.getProcessDefinitionId(), rootActivityInstance.getActivityId());
assertEquals(1, rootActivityInstance.getChildActivityInstances().length);
ActivityInstance outerSubProcessInstance = rootActivityInstance.getChildActivityInstances()[0];
assertEquals("outerSubProcess", outerSubProcessInstance.getActivityId());
ActivityInstance[] childActivityInstances = outerSubProcessInstance.getChildActivityInstances();
for (ActivityInstance activityInstance : childActivityInstances) {
assertTrue(Arrays.asList(new String[]{"subProcessA", "subProcessB"}).contains(activityInstance.getActivityId()));
ActivityInstance[] subProcessChildren = activityInstance.getChildActivityInstances();
assertEquals(1, subProcessChildren.length);
assertTrue(Arrays.asList(new String[]{"subProcessATask", "subProcessBTask"}).contains(subProcessChildren[0].getActivityId()));
}
// Completing both tasks should active the tasks outside the subprocesses
taskService.complete(taskA.getId());
taskService.complete(taskB.getId());
Task taskAfterSubProcess = taskQuery.singleResult();
assertEquals("Task after subprocess", taskAfterSubProcess.getName());
// Completing this task should end the process
taskService.complete(taskAfterSubProcess.getId());
assertProcessEnded(pi.getId());