jellyflow-runtime 0.2.0

Headless store, rules, schema, profile, and change pipeline for Jellyflow.
Documentation
use super::*;
use jellyflow_core::core::{
    Edge, EdgeId, EdgeKind, Graph, GraphId, NodeId, Port, PortCapacity, PortDirection, PortId,
    PortKey, PortKind,
};

#[test]
fn view_state_sanitize_removes_stale_ids() {
    let graph_id = GraphId::new();
    let mut graph = Graph::new(graph_id);

    let keep_node = NodeId::new();
    graph.nodes.insert(
        keep_node,
        jellyflow_core::core::Node {
            kind: jellyflow_core::core::NodeKindKey::new("test"),
            kind_version: 1,
            pos: jellyflow_core::core::CanvasPoint { x: 0.0, y: 0.0 },
            origin: None,
            selectable: None,
            focusable: None,
            draggable: None,
            connectable: None,
            deletable: None,
            parent: None,
            extent: None,
            expand_parent: None,
            size: None,
            hidden: false,
            collapsed: false,
            ports: Vec::new(),
            data: serde_json::Value::Null,
        },
    );
    let from_port = PortId::new();
    let to_port = PortId::new();
    let hidden_edge = EdgeId::new();
    let keep_edge = EdgeId::new();
    graph.ports.insert(
        from_port,
        Port {
            node: keep_node,
            key: PortKey::new("from"),
            dir: PortDirection::Out,
            kind: PortKind::Data,
            capacity: PortCapacity::Multi,
            connectable: None,
            connectable_start: None,
            connectable_end: None,
            ty: None,
            data: serde_json::Value::Null,
        },
    );
    graph.ports.insert(
        to_port,
        Port {
            node: keep_node,
            key: PortKey::new("to"),
            dir: PortDirection::In,
            kind: PortKind::Data,
            capacity: PortCapacity::Multi,
            connectable: None,
            connectable_start: None,
            connectable_end: None,
            ty: None,
            data: serde_json::Value::Null,
        },
    );
    graph.edges.insert(
        hidden_edge,
        Edge {
            kind: EdgeKind::Data,
            from: from_port,
            to: to_port,
            hidden: true,
            selectable: None,
            focusable: None,
            interaction_width: None,
            deletable: None,
            reconnectable: None,
        },
    );
    graph.edges.insert(
        keep_edge,
        Edge {
            kind: EdgeKind::Data,
            from: from_port,
            to: to_port,
            hidden: false,
            selectable: None,
            focusable: None,
            interaction_width: None,
            deletable: None,
            reconnectable: None,
        },
    );

    let mut state = NodeGraphViewState {
        selected_nodes: vec![keep_node, NodeId::new()],
        selected_edges: vec![hidden_edge, keep_edge],
        draw_order: vec![NodeId::new(), keep_node],
        edge_draw_order: vec![EdgeId::new(), hidden_edge, keep_edge],
        ..NodeGraphViewState::default()
    };

    state.sanitize_for_graph(&graph);
    assert_eq!(state.selected_nodes, vec![keep_node]);
    assert_eq!(state.selected_edges, vec![keep_edge]);
    assert_eq!(state.draw_order, vec![keep_node]);
    assert_eq!(state.edge_draw_order, vec![keep_edge]);
}

#[test]
fn view_state_sanitize_normalizes_invalid_viewport() {
    let graph = Graph::new(GraphId::new());
    let mut state = NodeGraphViewState {
        pan: jellyflow_core::core::CanvasPoint {
            x: f32::INFINITY,
            y: 10.0,
        },
        zoom: -1.0,
        ..NodeGraphViewState::default()
    };

    state.sanitize_for_graph(&graph);

    assert_eq!(state.pan, jellyflow_core::core::CanvasPoint::default());
    assert_eq!(state.zoom, NodeGraphViewState::default().zoom);

    state.set_viewport(
        jellyflow_core::core::CanvasPoint {
            x: 1.0,
            y: f32::NAN,
        },
        f32::NAN,
    );

    assert_eq!(state.pan, jellyflow_core::core::CanvasPoint::default());
    assert_eq!(state.zoom, NodeGraphViewState::default().zoom);
}