diff_element.rs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. use dioxus::core::Mutation::*;
  2. use dioxus::prelude::*;
  3. use dioxus_core::{AttributeValue, ElementId};
  4. #[test]
  5. fn text_diff() {
  6. fn app(cx: Scope) -> Element {
  7. let gen = cx.generation();
  8. cx.render(rsx!( h1 { "hello {gen}" } ))
  9. }
  10. let mut vdom = VirtualDom::new(app);
  11. _ = vdom.rebuild();
  12. vdom.mark_dirty(ScopeId::ROOT);
  13. assert_eq!(
  14. vdom.render_immediate().edits,
  15. [SetText { value: "hello 1", id: ElementId(2) }]
  16. );
  17. vdom.mark_dirty(ScopeId::ROOT);
  18. assert_eq!(
  19. vdom.render_immediate().edits,
  20. [SetText { value: "hello 2", id: ElementId(2) }]
  21. );
  22. vdom.mark_dirty(ScopeId::ROOT);
  23. assert_eq!(
  24. vdom.render_immediate().edits,
  25. [SetText { value: "hello 3", id: ElementId(2) }]
  26. );
  27. }
  28. #[test]
  29. fn element_swap() {
  30. fn app(cx: Scope) -> Element {
  31. let gen = cx.generation();
  32. match gen % 2 {
  33. 0 => cx.render(rsx!( h1 { "hello 1" } )),
  34. 1 => cx.render(rsx!( h2 { "hello 2" } )),
  35. _ => unreachable!(),
  36. }
  37. }
  38. let mut vdom = VirtualDom::new(app);
  39. _ = vdom.rebuild();
  40. vdom.mark_dirty(ScopeId::ROOT);
  41. assert_eq!(
  42. vdom.render_immediate().santize().edits,
  43. [
  44. LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
  45. ReplaceWith { id: ElementId(1,), m: 1 },
  46. ]
  47. );
  48. vdom.mark_dirty(ScopeId::ROOT);
  49. assert_eq!(
  50. vdom.render_immediate().santize().edits,
  51. [
  52. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  53. ReplaceWith { id: ElementId(2,), m: 1 },
  54. ]
  55. );
  56. vdom.mark_dirty(ScopeId::ROOT);
  57. assert_eq!(
  58. vdom.render_immediate().santize().edits,
  59. [
  60. LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
  61. ReplaceWith { id: ElementId(1,), m: 1 },
  62. ]
  63. );
  64. vdom.mark_dirty(ScopeId::ROOT);
  65. assert_eq!(
  66. vdom.render_immediate().santize().edits,
  67. [
  68. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  69. ReplaceWith { id: ElementId(2,), m: 1 },
  70. ]
  71. );
  72. }
  73. #[test]
  74. fn attribute_diff() {
  75. fn app(cx: Scope) -> Element {
  76. let gen = cx.generation();
  77. let attrs = cx.bump().alloc(match gen % 2 {
  78. 0 => vec![Attribute::new(
  79. "attr1",
  80. AttributeValue::Text("hello"),
  81. None,
  82. false,
  83. )],
  84. 1 => vec![
  85. Attribute::new("attr1", AttributeValue::Text("hello"), None, false),
  86. Attribute::new("attr2", AttributeValue::Float(1.0), None, false),
  87. Attribute::new("attr3", AttributeValue::Int(1), None, false),
  88. Attribute::new("attr4", AttributeValue::Bool(true), None, false),
  89. ],
  90. _ => unreachable!(),
  91. });
  92. cx.render(rsx!(
  93. div {
  94. ..*attrs,
  95. "hello"
  96. }
  97. ))
  98. }
  99. let mut vdom = VirtualDom::new(app);
  100. _ = vdom.rebuild();
  101. vdom.mark_dirty(ScopeId::ROOT);
  102. assert_eq!(
  103. vdom.render_immediate().santize().edits,
  104. [
  105. SetAttribute {
  106. name: "attr2",
  107. value: (&AttributeValue::Float(1.0)).into(),
  108. id: ElementId(1),
  109. ns: None
  110. },
  111. SetAttribute {
  112. name: "attr3",
  113. value: (&AttributeValue::Int(1)).into(),
  114. id: ElementId(1),
  115. ns: None
  116. },
  117. SetAttribute {
  118. name: "attr4",
  119. value: (&AttributeValue::Bool(true)).into(),
  120. id: ElementId(1),
  121. ns: None
  122. },
  123. ]
  124. );
  125. vdom.mark_dirty(ScopeId::ROOT);
  126. assert_eq!(
  127. vdom.render_immediate().santize().edits,
  128. [
  129. SetAttribute {
  130. name: "attr2",
  131. value: (&AttributeValue::None).into(),
  132. id: ElementId(1),
  133. ns: None
  134. },
  135. SetAttribute {
  136. name: "attr3",
  137. value: (&AttributeValue::None).into(),
  138. id: ElementId(1),
  139. ns: None
  140. },
  141. SetAttribute {
  142. name: "attr4",
  143. value: (&AttributeValue::None).into(),
  144. id: ElementId(1),
  145. ns: None
  146. },
  147. ]
  148. );
  149. vdom.mark_dirty(ScopeId::ROOT);
  150. assert_eq!(
  151. vdom.render_immediate().santize().edits,
  152. [
  153. SetAttribute {
  154. name: "attr2",
  155. value: (&AttributeValue::Float(1.0)).into(),
  156. id: ElementId(1),
  157. ns: None
  158. },
  159. SetAttribute {
  160. name: "attr3",
  161. value: (&AttributeValue::Int(1)).into(),
  162. id: ElementId(1),
  163. ns: None
  164. },
  165. SetAttribute {
  166. name: "attr4",
  167. value: (&AttributeValue::Bool(true)).into(),
  168. id: ElementId(1),
  169. ns: None
  170. },
  171. ]
  172. );
  173. }