bpmn-engine 0.1.0

BPMN 2.0 execution engine for Rust with JSON and XML format support
Documentation
//! Unit tests for Gateway elements

use bpmn_engine::activity::{DefaultActivityFactory, ActivityFactory};
use bpmn_engine::engine::ExecutionContext;
use bpmn_engine::model::{ProcessDefinition, ProcessElement, ElementBase, ExclusiveGateway, ParallelGateway, InclusiveGateway};
use test_log::test;
use tokio_test;

#[tokio::test]
async fn test_exclusive_gateway_activity_via_factory() {
    let factory = DefaultActivityFactory::new();
    let gateway = ProcessElement::ExclusiveGateway(ExclusiveGateway {
        base: ElementBase {
            id: "gateway1".to_string(),
            name: Some("Exclusive Gateway".to_string()),
            documentation: None,
        },
        default_flow: None,
    });

    let activity = factory.create_activity(&gateway).unwrap();
    let mut definition = ProcessDefinition::from_json(r#"
    {
        "id": "process1",
        "isExecutable": true,
        "elements": [
            {
                "type": "exclusiveGateway",
                "id": "gateway1"
            },
            {
                "type": "serviceTask",
                "id": "task1"
            },
            {
                "type": "sequenceFlow",
                "id": "flow1",
                "sourceRef": "gateway1",
                "targetRef": "task1"
            }
        ],
        "variables": {}
    }
    "#).unwrap();
    let mut context = ExecutionContext::new(definition.clone(), "instance1".to_string());

    let result = activity.execute(&mut context).await.unwrap();
    match result {
        bpmn_engine::activity::ActivityResult::Continue { next_elements } => {
            assert!(!next_elements.is_empty());
        }
        _ => panic!("Expected Continue result"),
    }
}

#[tokio::test]
async fn test_parallel_gateway_activity_via_factory() {
    let factory = DefaultActivityFactory::new();
    let gateway = ProcessElement::ParallelGateway(ParallelGateway {
        base: ElementBase {
            id: "gateway1".to_string(),
            name: Some("Parallel Gateway".to_string()),
            documentation: None,
        },
    });

    let activity = factory.create_activity(&gateway).unwrap();
    let mut definition = ProcessDefinition::from_json(r#"
    {
        "id": "process1",
        "isExecutable": true,
        "elements": [
            {
                "type": "parallelGateway",
                "id": "gateway1"
            },
            {
                "type": "serviceTask",
                "id": "task1"
            },
            {
                "type": "serviceTask",
                "id": "task2"
            },
            {
                "type": "sequenceFlow",
                "id": "flow1",
                "sourceRef": "gateway1",
                "targetRef": "task1"
            },
            {
                "type": "sequenceFlow",
                "id": "flow2",
                "sourceRef": "gateway1",
                "targetRef": "task2"
            }
        ],
        "variables": {}
    }
    "#).unwrap();
    let mut context = ExecutionContext::new(definition.clone(), "instance1".to_string());

    let result = activity.execute(&mut context).await.unwrap();
    match result {
        bpmn_engine::activity::ActivityResult::Continue { next_elements } => {
            assert_eq!(next_elements.len(), 2);
        }
        _ => panic!("Expected Continue result with multiple elements"),
    }
}

#[tokio::test]
async fn test_inclusive_gateway_activity_via_factory() {
    let factory = DefaultActivityFactory::new();
    let gateway = ProcessElement::InclusiveGateway(InclusiveGateway {
        base: ElementBase {
            id: "gateway1".to_string(),
            name: Some("Inclusive Gateway".to_string()),
            documentation: None,
        },
        default_flow: None,
    });

    let activity = factory.create_activity(&gateway).unwrap();
    let mut definition = ProcessDefinition::from_json(r#"
    {
        "id": "process1",
        "isExecutable": true,
        "elements": [
            {
                "type": "inclusiveGateway",
                "id": "gateway1"
            },
            {
                "type": "serviceTask",
                "id": "task1"
            },
            {
                "type": "sequenceFlow",
                "id": "flow1",
                "sourceRef": "gateway1",
                "targetRef": "task1"
            }
        ],
        "variables": {}
    }
    "#).unwrap();
    let mut context = ExecutionContext::new(definition.clone(), "instance1".to_string());

    let result = activity.execute(&mut context).await.unwrap();
    match result {
        bpmn_engine::activity::ActivityResult::Continue { next_elements } => {
            assert!(!next_elements.is_empty());
        }
        _ => panic!("Expected Continue result"),
    }
}