From 57f7bf045e7e324e0452cab74144cb4dd1909438 Mon Sep 17 00:00:00 2001 From: Hamza Date: Wed, 29 Dec 2021 00:33:56 +0500 Subject: [PATCH] make layout testing code public --- packages/yew/src/lib.rs | 2 + packages/yew/src/tests/layout_tests.rs | 142 +++++++++++++++++++++++ packages/yew/src/tests/mod.rs | 1 + packages/yew/src/virtual_dom/mod.rs | 147 +----------------------- packages/yew/src/virtual_dom/vcomp.rs | 2 +- packages/yew/src/virtual_dom/vlist.rs | 4 +- packages/yew/src/virtual_dom/vnode.rs | 2 +- packages/yew/src/virtual_dom/vportal.rs | 2 +- packages/yew/src/virtual_dom/vtag.rs | 2 +- packages/yew/src/virtual_dom/vtext.rs | 2 +- 10 files changed, 155 insertions(+), 151 deletions(-) create mode 100644 packages/yew/src/tests/layout_tests.rs create mode 100644 packages/yew/src/tests/mod.rs diff --git a/packages/yew/src/lib.rs b/packages/yew/src/lib.rs index 4d538b6388d..51783e9c06b 100644 --- a/packages/yew/src/lib.rs +++ b/packages/yew/src/lib.rs @@ -262,6 +262,8 @@ pub mod context; pub mod functional; pub mod html; pub mod scheduler; +#[cfg(test)] +pub mod tests; pub mod utils; pub mod virtual_dom; diff --git a/packages/yew/src/tests/layout_tests.rs b/packages/yew/src/tests/layout_tests.rs new file mode 100644 index 00000000000..283d78566ab --- /dev/null +++ b/packages/yew/src/tests/layout_tests.rs @@ -0,0 +1,142 @@ +use crate::html::{AnyScope, Scope}; +use crate::virtual_dom::{VDiff, VNode, VText}; +use crate::{Component, Context, Html}; +use gloo::console::log; +use web_sys::Node; +use yew::NodeRef; + +struct Comp; +impl Component for Comp { + type Message = (); + type Properties = (); + + fn create(_: &Context) -> Self { + unimplemented!() + } + + fn update(&mut self, _ctx: &Context, _: Self::Message) -> bool { + unimplemented!(); + } + + fn changed(&mut self, _ctx: &Context) -> bool { + unimplemented!() + } + + fn view(&self, _ctx: &Context) -> Html { + unimplemented!() + } +} + +#[derive(Debug)] +pub struct TestLayout<'a> { + pub name: &'a str, + pub node: VNode, + pub expected: &'a str, +} + +pub fn diff_layouts(layouts: Vec>) { + let document = gloo_utils::document(); + let parent_scope: AnyScope = Scope::::new(None).into(); + let parent_element = document.create_element("div").unwrap(); + let parent_node: Node = parent_element.clone().into(); + let end_node = document.create_text_node("END"); + parent_node.append_child(&end_node).unwrap(); + let mut empty_node: VNode = VText::new("").into(); + + // Tests each layout independently + let next_sibling = NodeRef::new(end_node.into()); + for layout in layouts.iter() { + // Apply the layout + let mut node = layout.node.clone(); + log!("Independently apply layout '{}'", layout.name); + + node.apply(&parent_scope, &parent_element, next_sibling.clone(), None); + assert_eq!( + parent_element.inner_html(), + format!("{}END", layout.expected), + "Independent apply failed for layout '{}'", + layout.name, + ); + + // Diff with no changes + let mut node_clone = layout.node.clone(); + + log!("Independently reapply layout '{}'", layout.name); + + node_clone.apply( + &parent_scope, + &parent_element, + next_sibling.clone(), + Some(node), + ); + assert_eq!( + parent_element.inner_html(), + format!("{}END", layout.expected), + "Independent reapply failed for layout '{}'", + layout.name, + ); + + // Detach + empty_node.clone().apply( + &parent_scope, + &parent_element, + next_sibling.clone(), + Some(node_clone), + ); + assert_eq!( + parent_element.inner_html(), + "END", + "Independent detach failed for layout '{}'", + layout.name, + ); + } + + // Sequentially apply each layout + let mut ancestor: Option = None; + for layout in layouts.iter() { + let mut next_node = layout.node.clone(); + + log!("Sequentially apply layout '{}'", layout.name); + next_node.apply( + &parent_scope, + &parent_element, + next_sibling.clone(), + ancestor, + ); + assert_eq!( + parent_element.inner_html(), + format!("{}END", layout.expected), + "Sequential apply failed for layout '{}'", + layout.name, + ); + ancestor = Some(next_node); + } + + // Sequentially detach each layout + for layout in layouts.into_iter().rev() { + let mut next_node = layout.node.clone(); + + log!("Sequentially detach layout '{}'", layout.name); + next_node.apply( + &parent_scope, + &parent_element, + next_sibling.clone(), + ancestor, + ); + assert_eq!( + parent_element.inner_html(), + format!("{}END", layout.expected), + "Sequential detach failed for layout '{}'", + layout.name, + ); + ancestor = Some(next_node); + } + + // Detach last layout + empty_node.apply(&parent_scope, &parent_element, next_sibling, ancestor); + assert_eq!( + parent_element.inner_html(), + "END", + "Failed to detach last layout" + ); +} diff --git a/packages/yew/src/tests/mod.rs b/packages/yew/src/tests/mod.rs new file mode 100644 index 00000000000..7c8881b072f --- /dev/null +++ b/packages/yew/src/tests/mod.rs @@ -0,0 +1 @@ +pub mod layout_tests; diff --git a/packages/yew/src/virtual_dom/mod.rs b/packages/yew/src/virtual_dom/mod.rs index e4ab84f044d..296a08aa98f 100644 --- a/packages/yew/src/virtual_dom/mod.rs +++ b/packages/yew/src/virtual_dom/mod.rs @@ -188,9 +188,9 @@ mod tests_attr_value { assert_eq!(b, c); assert_eq!(a, c); - assert!(a == b); - assert!(b == c); - assert!(a == c); + assert_eq!(a, b); + assert_eq!(b, c); + assert_eq!(a, c); } } @@ -538,147 +538,6 @@ pub(crate) fn insert_node(node: &Node, parent: &Element, next_sibling: Option<&N }; } -#[cfg(test)] -mod layout_tests { - use super::*; - use crate::html::{AnyScope, Scope}; - use crate::{Component, Context, Html}; - - struct Comp; - impl Component for Comp { - type Message = (); - type Properties = (); - - fn create(_: &Context) -> Self { - unimplemented!() - } - - fn update(&mut self, _ctx: &Context, _: Self::Message) -> bool { - unimplemented!(); - } - - fn changed(&mut self, _ctx: &Context) -> bool { - unimplemented!() - } - - fn view(&self, _ctx: &Context) -> Html { - unimplemented!() - } - } - - pub(crate) struct TestLayout<'a> { - pub(crate) name: &'a str, - pub(crate) node: VNode, - pub(crate) expected: &'a str, - } - - pub(crate) fn diff_layouts(layouts: Vec>) { - let document = gloo_utils::document(); - let parent_scope: AnyScope = Scope::::new(None).into(); - let parent_element = document.create_element("div").unwrap(); - let parent_node: Node = parent_element.clone().into(); - let end_node = document.create_text_node("END"); - parent_node.append_child(&end_node).unwrap(); - let mut empty_node: VNode = VText::new("").into(); - - // Tests each layout independently - let next_sibling = NodeRef::new(end_node.into()); - for layout in layouts.iter() { - // Apply the layout - let mut node = layout.node.clone(); - #[cfg(feature = "wasm_test")] - wasm_bindgen_test::console_log!("Independently apply layout '{}'", layout.name); - node.apply(&parent_scope, &parent_element, next_sibling.clone(), None); - assert_eq!( - parent_element.inner_html(), - format!("{}END", layout.expected), - "Independent apply failed for layout '{}'", - layout.name, - ); - - // Diff with no changes - let mut node_clone = layout.node.clone(); - #[cfg(feature = "wasm_test")] - wasm_bindgen_test::console_log!("Independently reapply layout '{}'", layout.name); - node_clone.apply( - &parent_scope, - &parent_element, - next_sibling.clone(), - Some(node), - ); - assert_eq!( - parent_element.inner_html(), - format!("{}END", layout.expected), - "Independent reapply failed for layout '{}'", - layout.name, - ); - - // Detach - empty_node.clone().apply( - &parent_scope, - &parent_element, - next_sibling.clone(), - Some(node_clone), - ); - assert_eq!( - parent_element.inner_html(), - "END", - "Independent detach failed for layout '{}'", - layout.name, - ); - } - - // Sequentially apply each layout - let mut ancestor: Option = None; - for layout in layouts.iter() { - let mut next_node = layout.node.clone(); - #[cfg(feature = "wasm_test")] - wasm_bindgen_test::console_log!("Sequentially apply layout '{}'", layout.name); - next_node.apply( - &parent_scope, - &parent_element, - next_sibling.clone(), - ancestor, - ); - assert_eq!( - parent_element.inner_html(), - format!("{}END", layout.expected), - "Sequential apply failed for layout '{}'", - layout.name, - ); - ancestor = Some(next_node); - } - - // Sequentially detach each layout - for layout in layouts.into_iter().rev() { - let mut next_node = layout.node.clone(); - #[cfg(feature = "wasm_test")] - wasm_bindgen_test::console_log!("Sequentially detach layout '{}'", layout.name); - next_node.apply( - &parent_scope, - &parent_element, - next_sibling.clone(), - ancestor, - ); - assert_eq!( - parent_element.inner_html(), - format!("{}END", layout.expected), - "Sequential detach failed for layout '{}'", - layout.name, - ); - ancestor = Some(next_node); - } - - // Detach last layout - empty_node.apply(&parent_scope, &parent_element, next_sibling, ancestor); - assert_eq!( - parent_element.inner_html(), - "END", - "Failed to detach last layout" - ); - } -} - #[cfg(all(test, feature = "wasm_bench"))] mod benchmarks { use super::*; diff --git a/packages/yew/src/virtual_dom/vcomp.rs b/packages/yew/src/virtual_dom/vcomp.rs index c7b58b74912..687a4e68869 100644 --- a/packages/yew/src/virtual_dom/vcomp.rs +++ b/packages/yew/src/virtual_dom/vcomp.rs @@ -559,7 +559,7 @@ mod layout_tests { extern crate self as yew; use crate::html; - use crate::virtual_dom::layout_tests::{diff_layouts, TestLayout}; + use crate::tests::layout_tests::{diff_layouts, TestLayout}; use crate::{Children, Component, Context, Html, Properties}; use std::marker::PhantomData; diff --git a/packages/yew/src/virtual_dom/vlist.rs b/packages/yew/src/virtual_dom/vlist.rs index 855a6ec51e2..8316288402f 100644 --- a/packages/yew/src/virtual_dom/vlist.rs +++ b/packages/yew/src/virtual_dom/vlist.rs @@ -348,7 +348,7 @@ mod layout_tests { extern crate self as yew; use crate::html; - use crate::virtual_dom::layout_tests::{diff_layouts, TestLayout}; + use crate::tests::layout_tests::{diff_layouts, TestLayout}; #[cfg(feature = "wasm_test")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; @@ -426,7 +426,7 @@ mod layout_tests_keys { extern crate self as yew; use crate::html; - use crate::virtual_dom::layout_tests::{diff_layouts, TestLayout}; + use crate::tests::layout_tests::{diff_layouts, TestLayout}; use crate::virtual_dom::VNode; use crate::{Children, Component, Context, Html, Properties}; use web_sys::Node; diff --git a/packages/yew/src/virtual_dom/vnode.rs b/packages/yew/src/virtual_dom/vnode.rs index c1d19df7c0e..6e64ef82d4f 100644 --- a/packages/yew/src/virtual_dom/vnode.rs +++ b/packages/yew/src/virtual_dom/vnode.rs @@ -258,7 +258,7 @@ impl PartialEq for VNode { #[cfg(test)] mod layout_tests { use super::*; - use crate::virtual_dom::layout_tests::{diff_layouts, TestLayout}; + use crate::tests::layout_tests::{diff_layouts, TestLayout}; #[cfg(feature = "wasm_test")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; diff --git a/packages/yew/src/virtual_dom/vportal.rs b/packages/yew/src/virtual_dom/vportal.rs index afde447db4c..f4dc14b0908 100644 --- a/packages/yew/src/virtual_dom/vportal.rs +++ b/packages/yew/src/virtual_dom/vportal.rs @@ -104,7 +104,7 @@ mod layout_tests { extern crate self as yew; use crate::html; - use crate::virtual_dom::layout_tests::{diff_layouts, TestLayout}; + use crate::tests::layout_tests::{diff_layouts, TestLayout}; use crate::virtual_dom::VNode; use yew::virtual_dom::VPortal; diff --git a/packages/yew/src/virtual_dom/vtag.rs b/packages/yew/src/virtual_dom/vtag.rs index 2dc5bb57f76..2c563f4acb7 100644 --- a/packages/yew/src/virtual_dom/vtag.rs +++ b/packages/yew/src/virtual_dom/vtag.rs @@ -1188,7 +1188,7 @@ mod layout_tests { extern crate self as yew; use crate::html; - use crate::virtual_dom::layout_tests::{diff_layouts, TestLayout}; + use crate::tests::layout_tests::{diff_layouts, TestLayout}; #[cfg(feature = "wasm_test")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; diff --git a/packages/yew/src/virtual_dom/vtext.rs b/packages/yew/src/virtual_dom/vtext.rs index c6f8aa658ab..b9e43fae4c2 100644 --- a/packages/yew/src/virtual_dom/vtext.rs +++ b/packages/yew/src/virtual_dom/vtext.rs @@ -121,7 +121,7 @@ mod layout_tests { extern crate self as yew; use crate::html; - use crate::virtual_dom::layout_tests::{diff_layouts, TestLayout}; + use crate::tests::layout_tests::{diff_layouts, TestLayout}; #[cfg(feature = "wasm_test")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure};