bijux-dag-runtime 0.4.1

Execution engine, replay semantics, and runtime policy layer for Bijux DAG graphs.
Documentation
use crate::state_machine::{
    failure_propagation_is_deterministic, node_transition_allowed, run_transition_allowed,
    NodeLifecycleState, RunLifecycleState,
};

#[test]
fn node_state_machine_has_explicit_legal_edges() {
    use NodeLifecycleState as S;
    assert!(node_transition_allowed(S::Pending, S::Ready));
    assert!(node_transition_allowed(S::Ready, S::Queued));
    assert!(node_transition_allowed(S::Queued, S::Running));
    assert!(node_transition_allowed(S::Running, S::Succeeded));
    assert!(node_transition_allowed(S::Running, S::Failed));
    assert!(node_transition_allowed(S::Ready, S::Cached));
    assert!(node_transition_allowed(S::Queued, S::Cached));
    assert!(node_transition_allowed(S::Pending, S::Skipped));
    assert!(node_transition_allowed(S::Ready, S::Skipped));
    assert!(node_transition_allowed(S::Queued, S::Skipped));
    assert!(node_transition_allowed(S::Pending, S::TimedOut));
    assert!(node_transition_allowed(S::Ready, S::TimedOut));
    assert!(node_transition_allowed(S::Queued, S::TimedOut));
    assert!(node_transition_allowed(S::Running, S::TimedOut));
    assert!(node_transition_allowed(S::Running, S::Cancelled));
    assert!(!node_transition_allowed(S::Succeeded, S::Running));
}

#[test]
fn run_state_machine_has_explicit_legal_edges() {
    use RunLifecycleState as S;
    assert!(run_transition_allowed(S::Queued, S::Ready));
    assert!(run_transition_allowed(S::Ready, S::Running));
    assert!(run_transition_allowed(S::Running, S::Succeeded));
    assert!(run_transition_allowed(S::Running, S::Failed));
    assert!(run_transition_allowed(S::Running, S::Cancelled));
    assert!(!run_transition_allowed(S::Succeeded, S::Running));
}

#[test]
fn failure_propagation_rule_is_deterministic() {
    assert!(!failure_propagation_is_deterministic(true, true));
    assert!(failure_propagation_is_deterministic(false, true));
    assert!(!failure_propagation_is_deterministic(false, false));
}

#[test]
fn terminal_node_states_have_no_outgoing_transitions() {
    use NodeLifecycleState as S;
    let terminal = [S::Succeeded, S::Failed, S::Cached, S::Skipped, S::Cancelled, S::TimedOut];
    let all = [
        S::Pending,
        S::Ready,
        S::Queued,
        S::Running,
        S::Succeeded,
        S::Failed,
        S::Cached,
        S::Skipped,
        S::Cancelled,
        S::TimedOut,
    ];
    for from in terminal {
        for to in all {
            assert!(!node_transition_allowed(from, to));
        }
    }
}

#[test]
fn terminal_run_states_have_no_outgoing_transitions() {
    use RunLifecycleState as S;
    let terminal = [S::Succeeded, S::Failed, S::Cached, S::Skipped, S::Cancelled];
    let all = [
        S::Queued,
        S::Ready,
        S::Running,
        S::Succeeded,
        S::Failed,
        S::Cached,
        S::Skipped,
        S::Cancelled,
    ];
    for from in terminal {
        for to in all {
            assert!(!run_transition_allowed(from, to));
        }
    }
}