dioxus/packages/core/tests/create_passthru.rs
Jonathan Kelley 0de3bf7aeb
Fix nested rsx expansion by not using template titles (#2799)
* Fix nested rsx expansion by not using template titles

* fix writers with nameless templates

* fix clippy

* dont commit vscode fix

* fix release mode, pull out __template_name

* fix axum_desktop

* Fix core tests

* Make most fields of HotReloadedTemplate public for testing

* wip: formatting, compare all diff cases

* slightly smarter diffing for dynamic nodes

* add a comment about generic node diffing

* clean up mutations a bit

* fix load template

* simplify maybe_rebuild

* Restore write mutations flag in web

* write_mutations -> skip_mutations

---------

Co-authored-by: Evan Almloff <evanalmloff@gmail.com>
2024-08-13 01:59:04 +00:00

100 lines
2.5 KiB
Rust

use dioxus::dioxus_core::Mutation::*;
use dioxus::prelude::*;
use dioxus_core::ElementId;
/// Should push the text node onto the stack and modify it
#[test]
fn nested_passthru_creates() {
fn app() -> Element {
rsx! {
PassThru {
PassThru {
PassThru { div { "hi" } }
}
}
}
}
#[component]
fn PassThru(children: Element) -> Element {
rsx!({ children })
}
let mut dom = VirtualDom::new(app);
let edits = dom.rebuild_to_vec();
assert_eq!(
edits.edits,
[
LoadTemplate { index: 0, id: ElementId(1) },
AppendChildren { m: 1, id: ElementId(0) },
]
)
}
/// Should load all the templates and append them
///
/// Take note on how we don't spit out the template for child_comp since it's entirely dynamic
#[test]
fn nested_passthru_creates_add() {
fn app() -> Element {
rsx! {
ChildComp {
"1"
ChildComp {
"2"
ChildComp {
"3"
div { "hi" }
}
}
}
}
}
#[component]
fn ChildComp(children: Element) -> Element {
rsx! {{children}}
}
let mut dom = VirtualDom::new(app);
assert_eq!(
dom.rebuild_to_vec().edits,
[
// load 1
LoadTemplate { index: 0, id: ElementId(1) },
// load 2
LoadTemplate { index: 0, id: ElementId(2) },
// load 3
LoadTemplate { index: 0, id: ElementId(3) },
// load div that contains 4
LoadTemplate { index: 1, id: ElementId(4) },
AppendChildren { id: ElementId(0), m: 4 },
]
);
}
/// note that the template is all dynamic roots - so it doesn't actually get cached as a template
#[test]
fn dynamic_node_as_root() {
fn app() -> Element {
let a = 123;
let b = 456;
rsx! { "{a}" "{b}" }
}
let mut dom = VirtualDom::new(app);
let edits = dom.rebuild_to_vec();
// Since the roots were all dynamic, they should not cause any template muations
// The root node is text, so we just create it on the spot
assert_eq!(
edits.edits,
[
CreateTextNode { value: "123".to_string(), id: ElementId(1) },
CreateTextNode { value: "456".to_string(), id: ElementId(2) },
AppendChildren { id: ElementId(0), m: 2 }
]
)
}