123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- use dioxus::prelude::*;
- #[test]
- #[allow(non_snake_case)]
- fn render_basic() {
- fn Base(cx: Scope) -> Element {
- render!(div {})
- }
- let dom = VirtualDom::new(Base);
- let static_vnodes = rsx!(div{"hello world"});
- let location = CodeLocation {
- file_path: String::new(),
- crate_path: String::new(),
- line: 0,
- column: 0,
- };
- let empty_context = CapturedContext {
- captured: IfmtArgs {
- named_args: Vec::new(),
- },
- components: Vec::new(),
- iterators: Vec::new(),
- expressions: Vec::new(),
- listeners: Vec::new(),
- location: location.clone(),
- custom_attributes: &[],
- };
- let interperted_vnodes = LazyNodes::new(|factory| {
- dioxus_rsx_interpreter::resolve_scope(
- location,
- "div{\"hello world\"}",
- empty_context,
- factory,
- )
- });
- let interperted_vnodes = dom.render_vnodes(interperted_vnodes);
- let static_vnodes = dom.render_vnodes(static_vnodes);
- assert!(check_eq(interperted_vnodes, static_vnodes));
- }
- #[test]
- #[allow(non_snake_case)]
- fn render_nested() {
- fn Base(cx: Scope) -> Element {
- render!(div {})
- }
- let dom = VirtualDom::new(Base);
- let static_vnodes = rsx! {
- div {
- p { "hello world" }
- div {
- p { "hello world" }
- }
- }
- };
- let location = CodeLocation {
- file_path: String::new(),
- crate_path: String::new(),
- line: 1,
- column: 0,
- };
- let empty_context = CapturedContext {
- captured: IfmtArgs {
- named_args: Vec::new(),
- },
- components: Vec::new(),
- iterators: Vec::new(),
- expressions: Vec::new(),
- listeners: Vec::new(),
- location: location.clone(),
- custom_attributes: &[],
- };
- let interperted_vnodes = LazyNodes::new(|factory| {
- dioxus_rsx_interpreter::resolve_scope(
- location,
- r#"div {
- p { "hello world" }
- div {
- p { "hello world" }
- }
- }"#,
- empty_context,
- factory,
- )
- });
- let interperted_vnodes = dom.render_vnodes(interperted_vnodes);
- let static_vnodes = dom.render_vnodes(static_vnodes);
- assert!(check_eq(interperted_vnodes, static_vnodes));
- }
- #[test]
- #[allow(non_snake_case)]
- fn render_custom_attribute() {
- fn Base(cx: Scope) -> Element {
- render!(div {})
- }
- let dom = VirtualDom::new(Base);
- let static_vnodes = rsx! {
- div {
- "data-test-1": 0,
- "data-test-2": "1",
- }
- };
- let location = CodeLocation {
- file_path: String::new(),
- crate_path: String::new(),
- line: 2,
- column: 0,
- };
- let empty_context = CapturedContext {
- captured: IfmtArgs {
- named_args: Vec::new(),
- },
- components: Vec::new(),
- iterators: Vec::new(),
- expressions: vec![("0", "0".to_string())],
- listeners: Vec::new(),
- location: location.clone(),
- custom_attributes: &["data-test-1", "data-test-2"],
- };
- let interperted_vnodes = LazyNodes::new(|factory| {
- dioxus_rsx_interpreter::resolve_scope(
- location,
- r#"div {
- "data-test-1": 0,
- "data-test-2": "1",
- }"#,
- empty_context,
- factory,
- )
- });
- let interperted_vnodes = dom.render_vnodes(interperted_vnodes);
- let static_vnodes = dom.render_vnodes(static_vnodes);
- assert!(check_eq(interperted_vnodes, static_vnodes));
- }
- #[test]
- #[allow(non_snake_case)]
- fn render_component() {
- fn Comp(cx: Scope) -> Element {
- render!(div {})
- }
- fn Base(cx: Scope) -> Element {
- render!(div {})
- }
- let dom = VirtualDom::new(Base);
- let static_vnodes = rsx! {
- div {
- Comp {}
- }
- };
- let location = CodeLocation {
- file_path: String::new(),
- crate_path: String::new(),
- line: 3,
- column: 0,
- };
- let interperted_vnodes = LazyNodes::new(|factory| {
- let context = CapturedContext {
- captured: IfmtArgs {
- named_args: Vec::new(),
- },
- components: vec![(
- r#"__cx.component(Comp, fc_to_builder(Comp).build(), None, "Comp")"#,
- factory.component(Comp, (), None, "Comp"),
- )],
- iterators: Vec::new(),
- expressions: Vec::new(),
- listeners: Vec::new(),
- location: location.clone(),
- custom_attributes: &[],
- };
- dioxus_rsx_interpreter::resolve_scope(
- location,
- r#"div {
- Comp {}
- }"#,
- context,
- factory,
- )
- });
- let interperted_vnodes = dom.render_vnodes(interperted_vnodes);
- let static_vnodes = dom.render_vnodes(static_vnodes);
- println!("{:#?}", interperted_vnodes);
- println!("{:#?}", static_vnodes);
- assert!(check_eq(interperted_vnodes, static_vnodes));
- }
- #[test]
- #[allow(non_snake_case)]
- fn render_iterator() {
- fn Base(cx: Scope) -> Element {
- render!(div {})
- }
- let dom = VirtualDom::new(Base);
- let iter = (0..10).map(|i| dom.render_vnodes(rsx! {"{i}"}));
- let static_vnodes = rsx! {
- div {
- iter
- }
- };
- let location = CodeLocation {
- file_path: String::new(),
- crate_path: String::new(),
- line: 4,
- column: 0,
- };
- let interperted_vnodes = LazyNodes::new(|factory| {
- let context = CapturedContext {
- captured: IfmtArgs {
- named_args: Vec::new(),
- },
- components: Vec::new(),
- iterators: vec![(
- r#"
- (0..10).map(|i| dom.render_vnodes(rsx!{"{i}"}))"#,
- factory.fragment_from_iter((0..10).map(|i| factory.text(format_args!("{i}")))),
- )],
- expressions: Vec::new(),
- listeners: Vec::new(),
- location: location.clone(),
- custom_attributes: &[],
- };
- dioxus_rsx_interpreter::resolve_scope(
- location,
- r#"div {
- (0..10).map(|i| dom.render_vnodes(rsx!{"{i}"}))
- }"#,
- context,
- factory,
- )
- });
- let interperted_vnodes = dom.render_vnodes(interperted_vnodes);
- let static_vnodes = dom.render_vnodes(static_vnodes);
- println!("{:#?}", interperted_vnodes);
- println!("{:#?}", static_vnodes);
- assert!(check_eq(interperted_vnodes, static_vnodes));
- }
- #[test]
- #[allow(non_snake_case)]
- fn render_captured_variable() {
- fn Base(cx: Scope) -> Element {
- render!(div {})
- }
- let dom = VirtualDom::new(Base);
- let x = 10;
- let static_vnodes = rsx! {
- div {
- "{x}"
- }
- };
- let location = CodeLocation {
- file_path: String::new(),
- crate_path: String::new(),
- line: 5,
- column: 0,
- };
- let interperted_vnodes = LazyNodes::new(|factory| {
- let context = CapturedContext {
- captured: IfmtArgs {
- named_args: vec![FormattedArg {
- expr: "x",
- format_args: "",
- result: x.to_string(),
- }],
- },
- components: Vec::new(),
- iterators: Vec::new(),
- expressions: Vec::new(),
- listeners: Vec::new(),
- location: location.clone(),
- custom_attributes: &[],
- };
- dioxus_rsx_interpreter::resolve_scope(
- location,
- r#"div {
- "{x}"
- }"#,
- context,
- factory,
- )
- });
- let interperted_vnodes = dom.render_vnodes(interperted_vnodes);
- let static_vnodes = dom.render_vnodes(static_vnodes);
- println!("{:#?}", interperted_vnodes);
- println!("{:#?}", static_vnodes);
- assert!(check_eq(interperted_vnodes, static_vnodes));
- }
- #[test]
- #[allow(non_snake_case)]
- fn render_listener() {
- fn Base(cx: Scope) -> Element {
- render!(div {})
- }
- let dom = VirtualDom::new(Base);
- let static_vnodes = rsx! {
- div {
- onclick: |_| println!("clicked")
- }
- };
- let location = CodeLocation {
- file_path: String::new(),
- crate_path: String::new(),
- line: 6,
- column: 0,
- };
- let interperted_vnodes = LazyNodes::new(|factory| {
- let f = |_| println!("clicked");
- let f = factory.bump().alloc(f);
- let context = CapturedContext {
- captured: IfmtArgs {
- named_args: Vec::new(),
- },
- components: Vec::new(),
- iterators: Vec::new(),
- expressions: Vec::new(),
- listeners: vec![(
- r#"dioxus_elements::on::onclick(__cx, |_| println!("clicked"))"#,
- dioxus_elements::on::onclick(factory, f),
- )],
- location: location.clone(),
- custom_attributes: &[],
- };
- dioxus_rsx_interpreter::resolve_scope(
- location,
- r#"div {
- onclick: |_| println!("clicked")
- }"#,
- context,
- factory,
- )
- });
- let interperted_vnodes = dom.render_vnodes(interperted_vnodes);
- let static_vnodes = dom.render_vnodes(static_vnodes);
- println!("{:#?}", interperted_vnodes);
- println!("{:#?}", static_vnodes);
- assert!(check_eq(interperted_vnodes, static_vnodes));
- }
- fn check_eq<'a>(a: &'a VNode<'a>, b: &'a VNode<'a>) -> bool {
- match (a, b) {
- (VNode::Text(t_a), VNode::Text(t_b)) => t_a.text == t_b.text,
- (VNode::Element(e_a), VNode::Element(e_b)) => {
- e_a.attributes
- .iter()
- .zip(e_b.attributes.iter())
- .all(|(a, b)| {
- a.is_static == b.is_static
- && a.is_volatile == b.is_volatile
- && a.name == b.name
- && a.value == b.value
- && a.namespace == b.namespace
- })
- && e_a
- .children
- .iter()
- .zip(e_b.children.iter())
- .all(|(a, b)| check_eq(a, b))
- && e_a.key == e_b.key
- && e_a.tag == e_b.tag
- && e_a.namespace == e_b.namespace
- && e_a
- .listeners
- .iter()
- .zip(e_b.listeners.iter())
- .all(|(a, b)| a.event == b.event)
- }
- (VNode::Fragment(f_a), VNode::Fragment(f_b)) => {
- f_a.key == f_b.key
- && f_a
- .children
- .iter()
- .zip(f_b.children.iter())
- .all(|(a, b)| check_eq(a, b))
- }
- (VNode::Component(c_a), VNode::Component(c_b)) => {
- c_a.can_memoize == c_b.can_memoize
- && c_a.key == c_b.key
- && c_a.fn_name == c_b.fn_name
- && c_a.user_fc == c_b.user_fc
- }
- (VNode::Placeholder(_), VNode::Placeholder(_)) => true,
- _ => false,
- }
- }
|