From c8eb5c7dd7195ff04504e5dee5f16a15c0b243ee Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 2 Feb 2023 14:26:59 -0600 Subject: [PATCH] update native core tests --- packages/native-core/tests/fuzzing.rs | 77 ++++--- packages/native-core/tests/miri_native.rs | 246 ++++++++++++---------- 2 files changed, 180 insertions(+), 143 deletions(-) diff --git a/packages/native-core/tests/fuzzing.rs b/packages/native-core/tests/fuzzing.rs index d35a98288..615371dcb 100644 --- a/packages/native-core/tests/fuzzing.rs +++ b/packages/native-core/tests/fuzzing.rs @@ -1,12 +1,10 @@ use dioxus::prelude::Props; use dioxus_core::*; use dioxus_native_core::{ - node_ref::{AttributeMask, NodeView}, + node_ref::{AttributeMask, AttributeMaskBuilder, NodeMaskBuilder, NodeView}, real_dom::RealDom, - state::{ParentDepState, State}, - NodeMask, SendAnyMap, + Dependancy, NodeMask, Pass, SendAnyMap, }; -use dioxus_native_core_macro::{sorted_str_slice, State}; use std::cell::Cell; fn random_ns() -> Option<&'static str> { @@ -295,25 +293,46 @@ fn create_random_element(cx: Scope) -> Element { } #[derive(Debug, Clone, PartialEq, Eq, Default)] -pub struct BlablaState {} - -/// Font style are inherited by default if not specified otherwise by some of the supported attributes. -impl ParentDepState for BlablaState { - type Ctx = (); - type DepState = (Self,); - - const NODE_MASK: NodeMask = - NodeMask::new_with_attrs(AttributeMask::Static(&sorted_str_slice!(["blabla",]))); - - fn reduce(&mut self, _node: NodeView, _parent: Option<(&Self,)>, _ctx: &Self::Ctx) -> bool { - false - } +pub struct BlablaState { + count: usize, } -#[derive(Clone, State, Default, Debug)] -pub struct NodeState { - #[parent_dep_state(blabla)] - blabla: BlablaState, +impl Pass for BlablaState { + type ParentDependencies = (Self,); + type ChildDependencies = (); + type NodeDependencies = (); + + const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new() + .with_attrs(AttributeMaskBuilder::Some(&["blabla"])) + .with_element(); + + fn pass<'a>( + &mut self, + node_view: NodeView, + _: ::ElementBorrowed<'a>, + parent: Option<::ElementBorrowed<'a>>, + _: Option::ElementBorrowed<'a>>>, + _: &SendAnyMap, + ) -> bool { + if let Some((parent,)) = parent { + if parent.count != 0 { + self.count += 1; + } + } + true + } + + fn create<'a>( + node_view: NodeView<()>, + node: ::ElementBorrowed<'a>, + parent: Option<::ElementBorrowed<'a>>, + children: Option::ElementBorrowed<'a>>>, + context: &SendAnyMap, + ) -> Self { + let mut myself = Self::default(); + myself.pass(node_view, node, parent, children, context); + myself + } } // test for panics when creating random nodes and templates @@ -328,11 +347,11 @@ fn create() { }, ); let mutations = vdom.rebuild(); - let mut rdom: RealDom = RealDom::new(); - let (to_update, _diff) = rdom.apply_mutations(mutations); + let mut rdom: RealDom = RealDom::new(Box::new([BlablaState::to_type_erased()])); + rdom.apply_mutations(mutations); let ctx = SendAnyMap::new(); - rdom.update_state(to_update, ctx); + rdom.update_state(ctx, false); } } @@ -349,17 +368,17 @@ fn diff() { }, ); let mutations = vdom.rebuild(); - let mut rdom: RealDom = RealDom::new(); - let (to_update, _diff) = rdom.apply_mutations(mutations); + let mut rdom: RealDom = RealDom::new(Box::new([BlablaState::to_type_erased()])); + rdom.apply_mutations(mutations); let ctx = SendAnyMap::new(); - rdom.update_state(to_update, ctx); + rdom.update_state(ctx, false); for _ in 0..10 { let mutations = vdom.render_immediate(); - let (to_update, _diff) = rdom.apply_mutations(mutations); + rdom.apply_mutations(mutations); let ctx = SendAnyMap::new(); - rdom.update_state(to_update, ctx); + rdom.update_state(ctx, false); } } } diff --git a/packages/native-core/tests/miri_native.rs b/packages/native-core/tests/miri_native.rs index 674f69aa7..9b5c995fa 100644 --- a/packages/native-core/tests/miri_native.rs +++ b/packages/native-core/tests/miri_native.rs @@ -1,140 +1,158 @@ -// use dioxus::prelude::*; -// use dioxus_native_core::{ -// node_ref::{AttributeMask, NodeView}, -// real_dom::RealDom, -// state::{ParentDepState, State}, -// NodeMask, SendAnyMap, -// }; -// use dioxus_native_core_macro::{sorted_str_slice, State}; -// use std::sync::{Arc, Mutex}; -// use tokio::time::sleep; +use dioxus::prelude::*; +use dioxus_core::*; +use dioxus_native_core::{ + node_ref::{AttributeMask, AttributeMaskBuilder, NodeMaskBuilder, NodeView}, + real_dom::RealDom, + Dependancy, NodeMask, Pass, SendAnyMap, +}; +use std::cell::Cell; +use std::sync::{Arc, Mutex}; +use tokio::time::sleep; -// #[derive(Debug, Clone, PartialEq, Eq, Default)] -// pub struct BlablaState {} +#[derive(Debug, Clone, PartialEq, Eq, Default)] +pub struct BlablaState { + count: usize, +} -// /// Font style are inherited by default if not specified otherwise by some of the supported attributes. -// impl ParentDepState for BlablaState { -// type Ctx = (); -// type DepState = (Self,); +impl Pass for BlablaState { + type ParentDependencies = (Self,); + type ChildDependencies = (); + type NodeDependencies = (); -// const NODE_MASK: NodeMask = -// NodeMask::new_with_attrs(AttributeMask::Static(&sorted_str_slice!(["blabla",]))); + const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new() + .with_attrs(AttributeMaskBuilder::Some(&["blabla"])) + .with_element(); -// fn reduce<'a>( -// &mut self, -// _node: NodeView, -// _parent: Option<(&'a Self,)>, -// _ctx: &Self::Ctx, -// ) -> bool { -// false -// } -// } + fn pass<'a>( + &mut self, + node_view: NodeView, + _: ::ElementBorrowed<'a>, + parent: Option<::ElementBorrowed<'a>>, + _: Option::ElementBorrowed<'a>>>, + _: &SendAnyMap, + ) -> bool { + if let Some((parent,)) = parent { + if parent.count != 0 { + self.count += 1; + } + } + true + } -// #[derive(Clone, State, Default, Debug)] -// pub struct NodeState { -// #[parent_dep_state(blabla)] -// blabla: BlablaState, -// } + fn create<'a>( + node_view: NodeView<()>, + node: ::ElementBorrowed<'a>, + parent: Option<::ElementBorrowed<'a>>, + children: Option::ElementBorrowed<'a>>>, + context: &SendAnyMap, + ) -> Self { + let mut myself = Self::default(); + myself.pass(node_view, node, parent, children, context); + myself + } +} -// mod dioxus_elements { -// macro_rules! builder_constructors { -// ( -// $( -// $(#[$attr:meta])* -// $name:ident { -// $( -// $(#[$attr_method:meta])* -// $fil:ident: $vil:ident, -// )* -// }; -// )* -// ) => { -// $( -// #[allow(non_camel_case_types)] -// $(#[$attr])* -// pub struct $name; +mod dioxus_elements { + macro_rules! builder_constructors { + ( + $( + $(#[$attr:meta])* + $name:ident { + $( + $(#[$attr_method:meta])* + $fil:ident: $vil:ident, + )* + }; + )* + ) => { + $( + #[allow(non_camel_case_types)] + $(#[$attr])* + pub struct $name; -// impl $name { -// pub const TAG_NAME: &'static str = stringify!($name); -// pub const NAME_SPACE: Option<&'static str> = None; + impl $name { + pub const TAG_NAME: &'static str = stringify!($name); + pub const NAME_SPACE: Option<&'static str> = None; -// $( -// pub const $fil: (&'static str, Option<&'static str>, bool) = (stringify!($fil), None, false); -// )* -// } + $( + pub const $fil: (&'static str, Option<&'static str>, bool) = (stringify!($fil), None, false); + )* + } -// impl GlobalAttributes for $name {} -// )* -// } -// } + impl GlobalAttributes for $name {} + )* + } + } -// pub trait GlobalAttributes {} + pub trait GlobalAttributes {} -// pub trait SvgAttributes {} + pub trait SvgAttributes {} -// builder_constructors! { -// blabla { + builder_constructors! { + blabla { -// }; -// } -// } + }; + } +} -// #[test] -// fn native_core_is_okay() { -// use std::time::Duration; +#[test] +fn native_core_is_okay() { + use std::time::Duration; -// fn app(cx: Scope) -> Element { -// let colors = use_state(cx, || vec!["green", "blue", "red"]); -// let padding = use_state(cx, || 10); + fn app(cx: Scope) -> Element { + let colors = use_state(cx, || vec!["green", "blue", "red"]); + let padding = use_state(cx, || 10); -// use_effect(cx, colors, |colors| async move { -// sleep(Duration::from_millis(1000)).await; -// colors.with_mut(|colors| colors.reverse()); -// }); + use_effect(cx, colors, |colors| async move { + sleep(Duration::from_millis(1000)).await; + colors.with_mut(|colors| colors.reverse()); + }); -// use_effect(cx, padding, |padding| async move { -// sleep(Duration::from_millis(10)).await; -// padding.with_mut(|padding| { -// if *padding < 65 { -// *padding += 1; -// } else { -// *padding = 5; -// } -// }); -// }); + use_effect(cx, padding, |padding| async move { + sleep(Duration::from_millis(10)).await; + padding.with_mut(|padding| { + if *padding < 65 { + *padding += 1; + } else { + *padding = 5; + } + }); + }); -// let _big = colors[0]; -// let _mid = colors[1]; -// let _small = colors[2]; + let _big = colors[0]; + let _mid = colors[1]; + let _small = colors[2]; -// cx.render(rsx! { -// blabla {} -// }) -// } + cx.render(rsx! { + blabla {} + }) + } -// let rt = tokio::runtime::Builder::new_current_thread() -// .enable_time() -// .build() -// .unwrap(); + let rt = tokio::runtime::Builder::new_current_thread() + .enable_time() + .build() + .unwrap(); -// rt.block_on(async { -// let rdom = Arc::new(Mutex::new(RealDom::::new())); -// let mut dom = VirtualDom::new(app); + rt.block_on(async { + let rdom = Arc::new(Mutex::new(RealDom::new(Box::new([ + BlablaState::to_type_erased(), + ])))); + let mut dom = VirtualDom::new(app); -// let muts = dom.rebuild(); -// let (to_update, _diff) = rdom.lock().unwrap().apply_mutations(muts); + let muts = dom.rebuild(); + rdom.lock().unwrap().apply_mutations(muts); -// let ctx = SendAnyMap::new(); -// rdom.lock().unwrap().update_state(to_update, ctx); + let ctx = SendAnyMap::new(); + rdom.lock().unwrap().update_state(ctx, false); -// for _ in 0..10 { -// dom.wait_for_work().await; + for _ in 0..10 { + dom.wait_for_work().await; -// let mutations = dom.render_immediate(); -// let (to_update, _diff) = rdom.lock().unwrap().apply_mutations(mutations); + let mutations = dom.render_immediate(); + rdom.lock().unwrap().apply_mutations(mutations); -// let ctx = SendAnyMap::new(); -// rdom.lock().unwrap().update_state(to_update, ctx); -// } -// }); -// } + let ctx = SendAnyMap::new(); + rdom.lock().unwrap().update_state(ctx, false); + } + }); +}