diff_element.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. use dioxus::core::Mutation::*;
  2. use dioxus::prelude::*;
  3. use dioxus_core::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(0));
  13. assert_eq!(
  14. vdom.render_immediate().dom_edits,
  15. [SetText { value: "hello 1", id: ElementId(2) }]
  16. );
  17. vdom.mark_dirty(ScopeId(0));
  18. assert_eq!(
  19. vdom.render_immediate().dom_edits,
  20. [SetText { value: "hello 2", id: ElementId(2) }]
  21. );
  22. vdom.mark_dirty(ScopeId(0));
  23. assert_eq!(
  24. vdom.render_immediate().dom_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(0));
  41. assert_eq!(
  42. vdom.render_immediate().santize().dom_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(0));
  49. assert_eq!(
  50. vdom.render_immediate().santize().dom_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(0));
  57. assert_eq!(
  58. vdom.render_immediate().santize().dom_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(0));
  65. assert_eq!(
  66. vdom.render_immediate().santize().dom_edits,
  67. [
  68. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  69. ReplaceWith { id: ElementId(2,), m: 1 },
  70. ]
  71. );
  72. }