diff --git a/packages/core/tests/diff_element.rs b/packages/core/tests/diff_element.rs index a0b9bfa84..e201dbb38 100644 --- a/packages/core/tests/diff_element.rs +++ b/packages/core/tests/diff_element.rs @@ -1,6 +1,6 @@ use dioxus::core::Mutation::*; use dioxus::prelude::*; -use dioxus_core::ElementId; +use dioxus_core::{AttributeValue, ElementId}; #[test] fn text_diff() { @@ -82,3 +82,111 @@ fn element_swap() { ] ); } + +#[test] +fn attribute_diff() { + fn app(cx: Scope) -> Element { + let gen = cx.generation(); + + let attrs = cx.bump().alloc(match gen % 2 { + 0 => vec![Attribute::new( + "attr1", + AttributeValue::Text("hello"), + None, + false, + )], + 1 => vec![ + Attribute::new("attr1", AttributeValue::Text("hello"), None, false), + Attribute::new("attr2", AttributeValue::Float(1.0), None, false), + Attribute::new("attr3", AttributeValue::Int(1), None, false), + Attribute::new("attr4", AttributeValue::Bool(true), None, false), + ], + _ => unreachable!(), + }); + + cx.render(rsx!( + div { + ..*attrs, + "hello" + } + )) + } + + let mut vdom = VirtualDom::new(app); + _ = vdom.rebuild(); + + vdom.mark_dirty(ScopeId::ROOT); + assert_eq!( + vdom.render_immediate().santize().edits, + [ + SetAttribute { + name: "attr2", + value: (&AttributeValue::Float(1.0)).into(), + id: ElementId(1), + ns: None + }, + SetAttribute { + name: "attr3", + value: (&AttributeValue::Int(1)).into(), + id: ElementId(1), + ns: None + }, + SetAttribute { + name: "attr4", + value: (&AttributeValue::Bool(true)).into(), + id: ElementId(1), + ns: None + }, + ] + ); + + vdom.mark_dirty(ScopeId::ROOT); + assert_eq!( + vdom.render_immediate().santize().edits, + [ + SetAttribute { + name: "attr2", + value: (&AttributeValue::None).into(), + id: ElementId(1), + ns: None + }, + SetAttribute { + name: "attr3", + value: (&AttributeValue::None).into(), + id: ElementId(1), + ns: None + }, + SetAttribute { + name: "attr4", + value: (&AttributeValue::None).into(), + id: ElementId(1), + ns: None + }, + ] + ); + + vdom.mark_dirty(ScopeId::ROOT); + assert_eq!( + vdom.render_immediate().santize().edits, + [ + SetAttribute { + name: "attr2", + value: (&AttributeValue::Float(1.0)).into(), + id: ElementId(1), + ns: None + }, + SetAttribute { + name: "attr3", + value: (&AttributeValue::Int(1)).into(), + id: ElementId(1), + ns: None + }, + SetAttribute { + name: "attr4", + value: (&AttributeValue::Bool(true)).into(), + id: ElementId(1), + ns: None + }, + ] + ); +}