Browse Source

add attribute diff test

Ege Gungordu 1 year ago
parent
commit
6111bdfdf0
1 changed files with 109 additions and 1 deletions
  1. 109 1
      packages/core/tests/diff_element.rs

+ 109 - 1
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
+            },
+        ]
+    );
+}