From 09b2ff27362dc9dfe5af893ea7c1424df60e488d Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Tue, 22 Nov 2022 21:44:20 -0800 Subject: [PATCH] feat: tests list --- packages/core/tests/bubble_error.rs | 1 + packages/core/tests/lists.rs | 46 +++++++++++++++++++++++++++++ packages/core/tests/passthru.rs | 14 ++++----- 3 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 packages/core/tests/bubble_error.rs create mode 100644 packages/core/tests/lists.rs diff --git a/packages/core/tests/bubble_error.rs b/packages/core/tests/bubble_error.rs new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/packages/core/tests/bubble_error.rs @@ -0,0 +1 @@ + diff --git a/packages/core/tests/lists.rs b/packages/core/tests/lists.rs new file mode 100644 index 000000000..d7a22c515 --- /dev/null +++ b/packages/core/tests/lists.rs @@ -0,0 +1,46 @@ +use dioxus::core::Mutation::*; +use dioxus::prelude::*; +use dioxus_core::ElementId; + +// A real-world usecase of templates at peak performance +// In react, this would be a lot of node creation. +// +// In Dioxus, we memoize the rsx! body and simplify it down to a few template loads +fn app(cx: Scope) -> Element { + cx.render(rsx! { + div { + (0..3).map(|i| rsx! { + div { + h1 { "hello world! "} + p { "{i}" } + } + }) + } + }) +} + +#[test] +fn list_renders() { + let mut dom = VirtualDom::new(app); + + let edits = dom.rebuild().santize(); + + assert_eq!( + edits.edits, + [ + // Load the outer div + LoadTemplate { name: "template", index: 0 }, + // Load each template one-by-one, rehydrating it + LoadTemplate { name: "template", index: 0 }, + HydrateText { path: &[1, 0], value: "0", id: ElementId(6) }, + LoadTemplate { name: "template", index: 0 }, + HydrateText { path: &[1, 0], value: "1", id: ElementId(7) }, + LoadTemplate { name: "template", index: 0 }, + HydrateText { path: &[1, 0], value: "2", id: ElementId(8) }, + // Replace the 0th childn on the div with the 3 templates on the stack + ReplacePlaceholder { m: 3, path: &[0] }, + // Append the container div to the dom + AppendChildren { m: 1 } + ] + ) +} diff --git a/packages/core/tests/passthru.rs b/packages/core/tests/passthru.rs index 6cd9146bd..a46249695 100644 --- a/packages/core/tests/passthru.rs +++ b/packages/core/tests/passthru.rs @@ -7,12 +7,10 @@ use dioxus_core::ElementId; fn nested_passthru_creates() { fn app(cx: Scope) -> Element { cx.render(rsx! { - Child { - Child { - Child { - div { - "hi" - } + pass_thru { + pass_thru { + pass_thru { + div { "hi" } } } } @@ -20,8 +18,8 @@ fn nested_passthru_creates() { } #[inline_props] - fn Child<'a>(cx: Scope<'a>, children: Element<'a>) -> Element { - cx.render(rsx! { children }) + fn pass_thru<'a>(cx: Scope<'a>, children: Element<'a>) -> Element { + cx.render(rsx!(children)) } let mut dom = VirtualDom::new(app);