mt-dom 0.59.2

A library for generating patches as a result diffing virtual DOM tree
Documentation
use mt_dom::{diff::*, patch::*, *};

pub type MyNode =
    Node<&'static str, &'static str, &'static str, &'static str, &'static str>;
#[test]
fn insert_on_deep_level_keyed() {
    let old: MyNode = element(
        "main",
        vec![attr("key", "container")],
        vec![
            element("div", vec![attr("key", "1")], vec![leaf("0")]),
            element("div", vec![attr("key", "3")], vec![leaf("2")]),
        ],
    );

    let new: MyNode = element(
        "main",
        vec![attr("key", "container")],
        vec![
            element("div", vec![attr("key", "1")], vec![leaf("0")]),
            element("div", vec![attr("key", "2")], vec![leaf("1")]),
            element("div", vec![attr("key", "3")], vec![leaf("2")]),
        ],
    );

    let diff = diff_with_key(&old, &new, &"key");

    dbg!(&diff);

    assert_eq!(
        diff,
        vec![Patch::insert_after_node(
            Some(&"div"),
            TreePath::new(vec![0]),
            vec![&element("div", vec![attr("key", "2")], vec![leaf("1")])]
        ),]
    );
}

#[test]
fn insert_on_deep_multi_level_level_keyed() {
    let old: MyNode = element(
        "main",
        vec![attr("key", "container")],
        vec![
            element("div", vec![attr("key", "1")], vec![leaf("0")]),
            element(
                "div",
                vec![attr("key", "2")],
                vec![
                    element("div", vec![attr("key", "a")], vec![]),
                    element("div", vec![attr("key", "c")], vec![]),
                ],
            ),
        ],
    );

    let new: MyNode = element(
        "main",
        vec![attr("key", "container")],
        vec![
            element("div", vec![attr("key", "1")], vec![leaf("0")]),
            element(
                "div",
                vec![attr("key", "2")],
                vec![
                    element("div", vec![attr("key", "a")], vec![]),
                    element("div", vec![attr("key", "b")], vec![]),
                    element("div", vec![attr("key", "c")], vec![]),
                ],
            ),
        ],
    );

    let diff = diff_with_key(&old, &new, &"key");

    dbg!(&diff);

    assert_eq!(
        diff,
        vec![Patch::insert_after_node(
            Some(&"div"),
            TreePath::new(vec![1, 0]),
            vec![&element("div", vec![attr("key", "b")], vec![])]
        ),]
    );
}

#[test]
fn insert_on_deep_multi_level_keyed_non_keyed_keyed() {
    let old: MyNode = element(
        "main",
        vec![attr("key", "container")],
        vec![
            element("div", vec![], vec![leaf("0")]),
            element(
                "div",
                vec![attr("key", "2")],
                vec![
                    element("div", vec![attr("key", "a")], vec![]),
                    element("div", vec![attr("key", "c")], vec![]),
                ],
            ),
        ],
    );

    let new: MyNode = element(
        "main",
        vec![attr("key", "container")],
        vec![
            element("div", vec![], vec![leaf("0")]),
            element(
                "div",
                vec![attr("key", "2")],
                vec![
                    element("div", vec![attr("key", "a")], vec![]),
                    element("div", vec![attr("key", "b")], vec![]),
                    element("div", vec![attr("key", "c")], vec![]),
                ],
            ),
        ],
    );

    let diff = diff_with_key(&old, &new, &"key");

    dbg!(&diff);

    assert_eq!(
        diff,
        vec![Patch::insert_after_node(
            Some(&"div"),
            TreePath::new(vec![1, 0]),
            vec![&element("div", vec![attr("key", "b")], vec![])]
        ),]
    );
}

#[test]
fn insert_on_deep_level_non_keyed_container() {
    let old: MyNode = element(
        "main",
        vec![],
        vec![
            element("div", vec![attr("key", "1")], vec![leaf("0")]),
            element("div", vec![attr("key", "3")], vec![leaf("2")]),
        ],
    );

    let new: MyNode = element(
        "main",
        vec![],
        vec![
            element("div", vec![attr("key", "1")], vec![leaf("0")]),
            element("div", vec![attr("key", "2")], vec![leaf("1")]),
            element("div", vec![attr("key", "3")], vec![leaf("2")]),
        ],
    );

    let diff = diff_with_key(&old, &new, &"key");

    dbg!(&diff);

    assert_eq!(
        diff,
        vec![Patch::insert_after_node(
            Some(&"div"),
            TreePath::new(vec![0]),
            vec![&element("div", vec![attr("key", "2")], vec![leaf("1")])]
        ),]
    );
}