diff_element.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. use dioxus::dioxus_core::Mutation::*;
  2. use dioxus::prelude::*;
  3. use dioxus_core::{ElementId, NoOpMutations};
  4. #[test]
  5. fn text_diff() {
  6. fn app() -> Element {
  7. let gen = generation();
  8. rsx!( h1 { "hello {gen}" } )
  9. }
  10. let mut vdom = VirtualDom::new(app);
  11. vdom.rebuild(&mut NoOpMutations);
  12. vdom.mark_dirty(ScopeId::ROOT);
  13. assert_eq!(
  14. vdom.render_immediate_to_vec().edits,
  15. [SetText { value: "hello 1".to_string(), id: ElementId(2) }]
  16. );
  17. vdom.mark_dirty(ScopeId::ROOT);
  18. assert_eq!(
  19. vdom.render_immediate_to_vec().edits,
  20. [SetText { value: "hello 2".to_string(), id: ElementId(2) }]
  21. );
  22. vdom.mark_dirty(ScopeId::ROOT);
  23. assert_eq!(
  24. vdom.render_immediate_to_vec().edits,
  25. [SetText { value: "hello 3".to_string(), id: ElementId(2) }]
  26. );
  27. }
  28. #[test]
  29. fn element_swap() {
  30. fn app() -> Element {
  31. let gen = generation();
  32. match gen % 2 {
  33. 0 => rsx!( h1 { "hello 1" } ),
  34. 1 => rsx!( h2 { "hello 2" } ),
  35. _ => unreachable!(),
  36. }
  37. }
  38. let mut vdom = VirtualDom::new(app);
  39. vdom.rebuild(&mut NoOpMutations);
  40. vdom.mark_dirty(ScopeId::ROOT);
  41. assert_eq!(
  42. vdom.render_immediate_to_vec().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_to_vec().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_to_vec().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_to_vec().santize().edits,
  67. [
  68. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  69. ReplaceWith { id: ElementId(2,), m: 1 },
  70. ]
  71. );
  72. }