//! Do we create fragments properly across complex boundaries?

use dioxus::core::Mutation::*;
use dioxus::prelude::*;
use dioxus_core::ElementId;

#[test]
fn empty_fragment_creates_nothing() {
    fn app(cx: Scope) -> Element {
        cx.render(rsx!(()))
    }

    let mut vdom = VirtualDom::new(app);
    let edits = vdom.rebuild();

    assert_eq!(
        edits.edits,
        [
            CreatePlaceholder { id: ElementId(1) },
            AppendChildren { id: ElementId(0), m: 1 }
        ]
    );
}

#[test]
fn root_fragments_work() {
    let mut vdom = VirtualDom::new(|cx| {
        cx.render(rsx!(
            div { "hello" }
            div { "goodbye" }
        ))
    });

    assert_eq!(
        vdom.rebuild().edits.last().unwrap(),
        &AppendChildren { id: ElementId(0), m: 2 }
    );
}

#[test]
fn fragments_nested() {
    let mut vdom = VirtualDom::new(|cx| {
        cx.render(rsx!(
            div { "hello" }
            div { "goodbye" }
            rsx! {
                div { "hello" }
                div { "goodbye" }
                rsx! {
                    div { "hello" }
                    div { "goodbye" }
                    rsx! {
                        div { "hello" }
                        div { "goodbye" }
                    }
                }
            }
        ))
    });

    assert_eq!(
        vdom.rebuild().edits.last().unwrap(),
        &AppendChildren { id: ElementId(0), m: 8 }
    );
}

#[test]
fn fragments_across_components() {
    fn app(cx: Scope) -> Element {
        cx.render(rsx! {
            demo_child {}
            demo_child {}
            demo_child {}
            demo_child {}
        })
    }

    fn demo_child(cx: Scope) -> Element {
        let world = "world";
        cx.render(rsx! {
            "hellO!"
            world
        })
    }

    assert_eq!(
        VirtualDom::new(app).rebuild().edits.last().unwrap(),
        &AppendChildren { id: ElementId(0), m: 8 }
    );
}

#[test]
fn list_fragments() {
    fn app(cx: Scope) -> Element {
        cx.render(rsx!(
            h1 {"hello"}
            (0..6).map(|f| rsx!( span { "{f}" }))
        ))
    }
    assert_eq!(
        VirtualDom::new(app).rebuild().edits.last().unwrap(),
        &AppendChildren { id: ElementId(0), m: 7 }
    );
}
