cranpose 0.1.171

Cranpose runtime and UI facade
Documentation
use std::rc::Rc;

use cranpose_ui::{LayoutNodeData, LayoutNodeKind, Modifier, Point, Rect};

use super::*;

fn layout(id: usize, children: Vec<LayoutBox>) -> LayoutBox {
    LayoutBox::new(
        id,
        Rect {
            x: 12.0,
            y: 18.0,
            width: 100.0,
            height: 40.0,
        },
        Point::default(),
        LayoutNodeData::new(
            Modifier::empty().padding(8.0),
            Default::default(),
            Rc::new(Default::default()),
            None,
            LayoutNodeKind::Layout,
        ),
        children,
    )
}

#[test]
fn empty_snapshot_keeps_request_identity() {
    let value = snapshot(None, 41, 20);
    assert_eq!(value.request_id, 41);
    assert_eq!(value.schema, 2);
    assert!(!value.truncated);
    assert!(value.nodes.is_empty());
}

#[test]
fn snapshot_preserves_hierarchy_geometry_and_generation() {
    let mut child = layout(2, Vec::new());
    child.node_generation = 7;
    let tree = LayoutTree::new(layout(1, vec![child]));
    let value = snapshot(Some(&tree), 8, 20);
    assert_eq!(value.nodes.len(), 2);
    assert_eq!(value.nodes[1].id, "2:7");
    assert_eq!(value.nodes[1].parent.as_deref(), Some("1:0"));
    assert_eq!(
        (
            value.nodes[1].x,
            value.nodes[1].y,
            value.nodes[1].width,
            value.nodes[1].height
        ),
        (12.0, 18.0, 100.0, 40.0)
    );
    let json = serde_json::to_value(value).expect("snapshot encodes");
    assert_eq!(json["requestId"], 8);
}

#[test]
fn node_budget_never_leaves_orphaned_children() {
    let tree = LayoutTree::new(layout(1, vec![layout(2, vec![layout(3, Vec::new())])]));
    let value = snapshot(Some(&tree), 1, 2);
    assert_eq!(value.nodes.len(), 2);
    assert!(value.truncated);
    assert_eq!(
        value.nodes[1].parent.as_deref(),
        Some(value.nodes[0].id.as_str())
    );
    assert!(snapshot(Some(&tree), 2, 0).nodes.is_empty());
}