From f614cbb401c3111235752cabeb9edfde865a3290 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Sun, 27 Nov 2022 00:56:49 -0500 Subject: [PATCH] wip: migrate all tests to core --- packages/core/src/create.rs | 2 +- packages/core/src/mutations.rs | 1 + packages/{dioxus => core}/tests/README.md | 0 .../tests/diff_keyed_list.rs} | 0 packages/core/tests/kitchen_sink.rs | 78 +++++++++++ packages/{dioxus => core}/tests/lifecycle.rs | 0 .../{dioxus => core}/tests/miri_stress.rs | 0 .../core/tests/{suspend.rs => suspense.rs} | 25 +++- packages/dioxus/tests/.rustfmt.toml | 1 - packages/dioxus/tests/rsx_syntax.rs | 83 ------------ packages/dioxus/tests/sharedstate.rs | 126 ------------------ packages/dioxus/tests/suspense.rs | 61 --------- 12 files changed, 104 insertions(+), 273 deletions(-) rename packages/{dioxus => core}/tests/README.md (100%) rename packages/{dioxus/tests/diffing.rs => core/tests/diff_keyed_list.rs} (100%) create mode 100644 packages/core/tests/kitchen_sink.rs rename packages/{dioxus => core}/tests/lifecycle.rs (100%) rename packages/{dioxus => core}/tests/miri_stress.rs (100%) rename packages/core/tests/{suspend.rs => suspense.rs} (69%) delete mode 100644 packages/dioxus/tests/.rustfmt.toml delete mode 100644 packages/dioxus/tests/rsx_syntax.rs delete mode 100644 packages/dioxus/tests/sharedstate.rs delete mode 100644 packages/dioxus/tests/suspense.rs diff --git a/packages/core/src/create.rs b/packages/core/src/create.rs index ccc95887a..81be55199 100644 --- a/packages/core/src/create.rs +++ b/packages/core/src/create.rs @@ -235,7 +235,7 @@ impl<'b: 'static> VirtualDom { TemplateNode::DynamicText { .. } => self .mutations .template_mutations - .push(CreateStaticText { value: "d" }), + .push(CreateTextPlaceholder), TemplateNode::Element { attrs, diff --git a/packages/core/src/mutations.rs b/packages/core/src/mutations.rs index 3627836df..fa404fafe 100644 --- a/packages/core/src/mutations.rs +++ b/packages/core/src/mutations.rs @@ -81,6 +81,7 @@ pub enum Mutation<'a> { id: ElementId, }, CreateStaticPlaceholder, + CreateTextPlaceholder, CreateStaticText { value: &'a str, }, diff --git a/packages/dioxus/tests/README.md b/packages/core/tests/README.md similarity index 100% rename from packages/dioxus/tests/README.md rename to packages/core/tests/README.md diff --git a/packages/dioxus/tests/diffing.rs b/packages/core/tests/diff_keyed_list.rs similarity index 100% rename from packages/dioxus/tests/diffing.rs rename to packages/core/tests/diff_keyed_list.rs diff --git a/packages/core/tests/kitchen_sink.rs b/packages/core/tests/kitchen_sink.rs new file mode 100644 index 000000000..7071cb120 --- /dev/null +++ b/packages/core/tests/kitchen_sink.rs @@ -0,0 +1,78 @@ +use dioxus::core::{ElementId, Mutation}; +use dioxus::prelude::*; + +fn basic_syntax_is_a_template(cx: Scope) -> Element { + let asd = 123; + let var = 123; + + cx.render(rsx! { + div { key: "12345", + class: "asd", + class: "{asd}", + onclick: move |_| {}, + div { "{var}" } + div { + h1 { "var" } + p { "you're great!" } + div { background_color: "red", + h1 { "var" } + div { b { "asd" } "not great" } + } + p { "you're great!" } + } + } + }) +} +#[test] +fn dual_stream() { + let mut dom = VirtualDom::new(basic_syntax_is_a_template); + let edits = dom.rebuild().santize(); + + use Mutation::*; + assert_eq!( + edits.template_mutations, + [ + CreateElement { name: "div" }, + SetStaticAttribute { name: "class", value: "asd", ns: None }, + CreateElement { name: "div" }, + CreateTextPlaceholder, + AppendChildren { m: 1 }, + CreateElement { name: "div" }, + CreateElement { name: "h1" }, + CreateStaticText { value: "var" }, + AppendChildren { m: 1 }, + CreateElement { name: "p" }, + CreateStaticText { value: "you're great!" }, + AppendChildren { m: 1 }, + CreateElement { name: "div" }, + SetStaticAttribute { name: "background-color", value: "red", ns: Some("style") }, + CreateElement { name: "h1" }, + CreateStaticText { value: "var" }, + AppendChildren { m: 1 }, + CreateElement { name: "div" }, + CreateElement { name: "b" }, + CreateStaticText { value: "asd" }, + AppendChildren { m: 1 }, + CreateStaticText { value: "not great" }, + AppendChildren { m: 2 }, + AppendChildren { m: 2 }, + CreateElement { name: "p" }, + CreateStaticText { value: "you're great!" }, + AppendChildren { m: 1 }, + AppendChildren { m: 4 }, + AppendChildren { m: 2 }, + SaveTemplate { name: "template", m: 1 } + ], + ); + + assert_eq!( + edits.edits, + [ + LoadTemplate { name: "template", index: 0, id: ElementId(1) }, + SetAttribute { name: "class", value: "123", id: ElementId(1), ns: None }, + NewEventListener { event_name: "click", scope: ScopeId(0), id: ElementId(1) }, + HydrateText { path: &[0, 0], value: "123", id: ElementId(2) }, + AppendChildren { m: 1 } + ], + ); +} diff --git a/packages/dioxus/tests/lifecycle.rs b/packages/core/tests/lifecycle.rs similarity index 100% rename from packages/dioxus/tests/lifecycle.rs rename to packages/core/tests/lifecycle.rs diff --git a/packages/dioxus/tests/miri_stress.rs b/packages/core/tests/miri_stress.rs similarity index 100% rename from packages/dioxus/tests/miri_stress.rs rename to packages/core/tests/miri_stress.rs diff --git a/packages/core/tests/suspend.rs b/packages/core/tests/suspense.rs similarity index 69% rename from packages/core/tests/suspend.rs rename to packages/core/tests/suspense.rs index 559c4e4ce..c0d89a10f 100644 --- a/packages/core/tests/suspend.rs +++ b/packages/core/tests/suspense.rs @@ -2,6 +2,7 @@ use dioxus::core::ElementId; use dioxus::core::{Mutation::*, SuspenseBoundary}; use dioxus::prelude::*; use dioxus_core::SuspenseContext; +use std::future::IntoFuture; use std::{rc::Rc, time::Duration}; #[tokio::test] @@ -63,5 +64,27 @@ async fn async_child(cx: Scope<'_>) -> Element { } async fn async_text(cx: Scope<'_>) -> Element { - cx.render(rsx!("async_text")) + let username = use_future!(cx, || async { + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + "async child 1" + }); + + let age = use_future!(cx, || async { + tokio::time::sleep(std::time::Duration::from_secs(2)).await; + println!("long future completed"); + 1234 + }); + + let (_user, _age) = use_future!(cx, || async { + tokio::join!( + tokio::time::sleep(std::time::Duration::from_secs(1)), + tokio::time::sleep(std::time::Duration::from_secs(2)) + ); + ("async child 1", 1234) + }) + .await; + + let (username, age) = tokio::join!(username.into_future(), age.into_future()); + + cx.render(rsx!( div { "Hello! {username}, you are {age}, {_user} {_age}" } )) } diff --git a/packages/dioxus/tests/.rustfmt.toml b/packages/dioxus/tests/.rustfmt.toml deleted file mode 100644 index 70a9483a8..000000000 --- a/packages/dioxus/tests/.rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ -struct_lit_width = 80 diff --git a/packages/dioxus/tests/rsx_syntax.rs b/packages/dioxus/tests/rsx_syntax.rs deleted file mode 100644 index 4401e1ed0..000000000 --- a/packages/dioxus/tests/rsx_syntax.rs +++ /dev/null @@ -1,83 +0,0 @@ -fn basic_syntax_is_a_template(cx: Scope) -> Element { - let asd = 123; - let var = 123; - - cx.render(rsx! { - div { key: "12345", - class: "asd", - class: "{asd}", - onclick: move |_| {}, - div { "{var}" } - div { - h1 { "var" } - p { "you're great!" } - div { background_color: "red", - h1 { "var" } - div { b { "asd" } "not great" } - } - p { "you're great!" } - } - } - }) -} - -// imports come after the test since the rsx! macro is sensitive to its location in the file -// (the byte index is used to differentiate sub templates) -use dioxus::core::{ElementId, Mutation}; -use dioxus::prelude::*; - -#[test] -fn dual_stream() { - let mut dom = VirtualDom::new(basic_syntax_is_a_template); - let edits = dom.rebuild(); - - use Mutation::*; - assert_eq!( - edits.template_mutations, - vec![ - CreateElement { name: "div", namespace: None, id: ElementId(1) }, - SetAttribute { name: "class", value: "asd", id: ElementId(1) }, - CreateElement { name: "div", namespace: None, id: ElementId(2) }, - CreatePlaceholder { id: ElementId(3) }, - AppendChildren { m: 1 }, - CreateElement { name: "div", namespace: None, id: ElementId(4) }, - CreateElement { name: "h1", namespace: None, id: ElementId(5) }, - CreateTextNode { value: "var" }, - AppendChildren { m: 1 }, - CreateElement { name: "p", namespace: None, id: ElementId(6) }, - CreateTextNode { value: "you're great!" }, - AppendChildren { m: 1 }, - CreateElement { name: "div", namespace: None, id: ElementId(7) }, - SetAttribute { name: "background-color", value: "red", id: ElementId(7) }, - CreateElement { name: "h1", namespace: None, id: ElementId(8) }, - CreateTextNode { value: "var" }, - AppendChildren { m: 1 }, - CreateElement { name: "div", namespace: None, id: ElementId(9) }, - CreateElement { name: "b", namespace: None, id: ElementId(10) }, - CreateTextNode { value: "asd" }, - AppendChildren { m: 1 }, - CreateTextNode { value: "not great" }, - AppendChildren { m: 2 }, - AppendChildren { m: 2 }, - CreateElement { name: "p", namespace: None, id: ElementId(11) }, - CreateTextNode { value: "you're great!" }, - AppendChildren { m: 1 }, - AppendChildren { m: 4 }, - AppendChildren { m: 2 }, - SaveTemplate { name: "packages/dioxus/tests/rsx_syntax.rs:5:15:122", m: 1 } - ] - ); - - assert_eq!( - edits.edits, - vec![ - LoadTemplate { name: "packages/dioxus/tests/rsx_syntax.rs:5:15:122", index: 0 }, - AssignId { path: &[], id: ElementId(12) }, - SetAttribute { name: "class", value: "123", id: ElementId(12) }, - SetAttribute { name: "onclick", value: "asd", id: ElementId(12) }, // ---- todo: listeners - HydrateText { path: &[0, 0], value: "123", id: ElementId(13) }, - ReplacePlaceholder { m: 1, path: &[0, 0] }, - AppendChildren { m: 1 } - ] - ); -} diff --git a/packages/dioxus/tests/sharedstate.rs b/packages/dioxus/tests/sharedstate.rs deleted file mode 100644 index 3b6f3559c..000000000 --- a/packages/dioxus/tests/sharedstate.rs +++ /dev/null @@ -1,126 +0,0 @@ -#![allow(unused, non_upper_case_globals, non_snake_case)] - -use dioxus::{core_macro::rsx_without_templates, prelude::*}; -use dioxus_core::{DomEdit, Mutations, SchedulerMsg, ScopeId}; -use std::rc::Rc; -use DomEdit::*; - -#[test] -fn shared_state_test() { - struct MySharedState(&'static str); - - static App: Component = |cx| { - cx.provide_context(Rc::new(MySharedState("world!"))); - cx.render(rsx_without_templates!(Child {})) - }; - - static Child: Component = |cx| { - let shared = cx.consume_context::>()?; - cx.render(rsx_without_templates!("Hello, {shared.0}")) - }; - - let mut dom = VirtualDom::new(App); - let Mutations { edits, .. } = dom.rebuild(); - - assert_eq!( - edits, - [ - CreateTextNode { root: Some(1), text: "Hello, world!" }, - AppendChildren { root: Some(0), children: vec![1] }, - ] - ); -} - -#[test] -fn swap_test() { - struct MySharedState(&'static str); - - fn app(cx: Scope) -> Element { - let val = cx.use_hook(|| 0); - *val += 1; - - cx.provide_context(Rc::new(MySharedState("world!"))); - - let child = match *val % 2 { - 0 => rsx_without_templates!( - Child1 { - Child1 { } - Child2 { } - } - ), - _ => rsx_without_templates!( - Child2 { - Child2 { } - Child2 { } - } - ), - }; - - cx.render(rsx_without_templates!( - Router { - div { child } - } - )) - } - - #[inline_props] - fn Router<'a>(cx: Scope, children: Element<'a>) -> Element<'a> { - cx.render(rsx_without_templates!(div { children })) - } - - #[inline_props] - fn Child1<'a>(cx: Scope, children: Element<'a>) -> Element { - let shared = cx.consume_context::>().unwrap(); - println!("Child1: {}", shared.0); - cx.render(rsx_without_templates! { - div { - "{shared.0}", - children - } - }) - } - - #[inline_props] - fn Child2<'a>(cx: Scope, children: Element<'a>) -> Element { - let shared = cx.consume_context::>().unwrap(); - println!("Child2: {}", shared.0); - cx.render(rsx_without_templates! { - h1 { - "{shared.0}", - children - } - }) - } - - let mut dom = VirtualDom::new(app); - let Mutations { edits, .. } = dom.rebuild(); - - dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - dom.work_with_deadline(|| false); - dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - dom.work_with_deadline(|| false); - dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - dom.work_with_deadline(|| false); - dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - dom.work_with_deadline(|| false); - dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - dom.work_with_deadline(|| false); - dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - dom.work_with_deadline(|| false); - - // dom.handle_message(SchedulerMsg::Immediate(ScopeId(1))); - // dom.work_with_deadline(|| false); - - // dom.handle_message(SchedulerMsg::Immediate(ScopeId(2))); - // dom.work_with_deadline(|| false); - - // dom.handle_message(SchedulerMsg::Immediate(ScopeId(3))); - // dom.work_with_deadline(|| false); - - // dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - // dom.work_with_deadline(|| false); - // dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - // dom.work_with_deadline(|| false); - // dom.handle_message(SchedulerMsg::Immediate(ScopeId(0))); - // dom.work_with_deadline(|| false); -} diff --git a/packages/dioxus/tests/suspense.rs b/packages/dioxus/tests/suspense.rs deleted file mode 100644 index 7e539c423..000000000 --- a/packages/dioxus/tests/suspense.rs +++ /dev/null @@ -1,61 +0,0 @@ -use std::{future::IntoFuture, rc::Rc}; - -use dioxus::prelude::*; -use dioxus_core::SuspenseBoundary; - -#[tokio::test] -async fn basic_prints() { - let mut dom = VirtualDom::new(|cx| { - cx.render(rsx! { - div { - h1 { "var" } - suspense_boundary { - basic_child { } - async_child { } - } - } - }) - }); - - dbg!(dom.rebuild()); - - dom.wait_for_work().await; - - dbg!(dom.rebuild()); -} - -#[inline_props] -fn suspense_boundary<'a>(cx: Scope<'a>, children: Element<'a>) -> Element { - cx.use_hook(|| cx.provide_context(Rc::new(SuspenseBoundary::new(cx.scope_id())))); - cx.render(rsx! { children }) -} - -fn basic_child(cx: Scope) -> Element { - cx.render(rsx!( div { "basic child 1" } )) -} - -async fn async_child(cx: Scope<'_>) -> Element { - let username = use_future!(cx, || async { - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - "async child 1" - }); - - let age = use_future!(cx, || async { - tokio::time::sleep(std::time::Duration::from_secs(2)).await; - println!("long future completed"); - 1234 - }); - - let (_user, _age) = use_future!(cx, || async { - tokio::join!( - tokio::time::sleep(std::time::Duration::from_secs(1)), - tokio::time::sleep(std::time::Duration::from_secs(2)) - ); - ("async child 1", 1234) - }) - .await; - - let (username, age) = tokio::join!(username.into_future(), age.into_future()); - - cx.render(rsx!( div { "Hello! {username}, you are {age}, {_user} {_age}" } )) -}