promkit-widgets 0.7.0

Widgets for promkit
Documentation
use std::str::FromStr;

use promkit_widgets::json::jsonz::*;

#[test]
fn collapses_open_containers() {
    let input = serde_json::Value::from_str(
        r#"
            {
                "object": {
                    "key": "value"
                },
                "array": [
                    1,
                    2,
                    3
                ]
            }
        "#,
    )
    .unwrap();

    let mut rows = create_rows([&input]);

    let index = rows.toggle(1);
    assert_eq!(index, 1);
    assert_eq!(
        rows[1].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Object,
            collapsed: true,
            close_index: 3
        })
    );
    assert_eq!(
        rows[3].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Object,
            collapsed: true,
            open_index: 1
        })
    );

    let index = rows.toggle(4);
    assert_eq!(index, 4);
    assert_eq!(
        rows[4].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Array,
            collapsed: true,
            close_index: 8
        })
    );
    assert_eq!(
        rows[8].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Array,
            collapsed: true,
            open_index: 4
        })
    );

    let index = rows.toggle(0);
    assert_eq!(index, 0);
    assert_eq!(
        rows[0].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Object,
            collapsed: true,
            close_index: 9
        })
    );
    assert_eq!(
        rows[9].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Object,
            collapsed: true,
            open_index: 0
        })
    );

    rows.toggle(0);
    assert_eq!(
        rows[0].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Object,
            collapsed: false,
            close_index: 9
        })
    );
    assert_eq!(
        rows[9].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Object,
            collapsed: false,
            open_index: 0
        })
    );

    rows.toggle(4);
    assert_eq!(
        rows[4].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Array,
            collapsed: false,
            close_index: 8
        })
    );
    assert_eq!(
        rows[8].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Array,
            collapsed: false,
            open_index: 4
        })
    );

    rows.toggle(1);
    assert_eq!(
        rows[1].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Object,
            collapsed: false,
            close_index: 3
        })
    );
    assert_eq!(
        rows[3].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Object,
            collapsed: false,
            open_index: 1
        })
    );
}

#[test]
fn expands_collapsed_containers() {
    let input = serde_json::Value::from_str(
        r#"
            {
                "object": {
                    "key": "value"
                },
                "array": [
                    1,
                    2,
                    3
                ]
            }
        "#,
    )
    .unwrap();

    let mut rows = create_rows([&input]);

    let index = rows.toggle(3);
    assert_eq!(index, 1);
    assert_eq!(
        rows[1].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Object,
            collapsed: true,
            close_index: 3
        })
    );
    assert_eq!(
        rows[3].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Object,
            collapsed: true,
            open_index: 1
        })
    );

    let index = rows.toggle(8);
    assert_eq!(index, 4);
    assert_eq!(
        rows[4].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Array,
            collapsed: true,
            close_index: 8
        })
    );
    assert_eq!(
        rows[8].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Array,
            collapsed: true,
            open_index: 4
        })
    );

    let index = rows.toggle(9);
    assert_eq!(index, 0);
    assert_eq!(
        rows[0].node,
        JsonNode::Container(ContainerNode::Open {
            typ: ContainerType::Object,
            collapsed: true,
            close_index: 9
        })
    );
    assert_eq!(
        rows[9].node,
        JsonNode::Container(ContainerNode::Close {
            typ: ContainerType::Object,
            collapsed: true,
            open_index: 0
        })
    );
}