attr_cleanup.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //! dynamic attributes in dioxus necessitate an allocated node ID.
  2. //!
  3. //! This tests to ensure we clean it up
  4. use dioxus::core::{ElementId, Mutation::*};
  5. use dioxus::prelude::*;
  6. #[test]
  7. fn attrs_cycle() {
  8. let mut dom = VirtualDom::new(|cx| {
  9. let id = cx.generation();
  10. match cx.generation() % 2 {
  11. 0 => cx.render(rsx! {
  12. div {}
  13. }),
  14. 1 => cx.render(rsx! {
  15. div {
  16. h1 { class: "{id}", id: "{id}" }
  17. }
  18. }),
  19. _ => unreachable!(),
  20. }
  21. });
  22. assert_eq!(
  23. dom.rebuild().santize().edits,
  24. [
  25. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  26. AppendChildren { m: 1 },
  27. ]
  28. );
  29. dom.mark_dirty(ScopeId(0));
  30. assert_eq!(
  31. dom.render_immediate().santize().edits,
  32. [
  33. LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
  34. AssignId { path: &[0,], id: ElementId(3,) },
  35. SetAttribute { name: "class", value: "1", id: ElementId(3,), ns: None },
  36. SetAttribute { name: "id", value: "1", id: ElementId(3,), ns: None },
  37. ReplaceWith { id: ElementId(1,), m: 1 },
  38. ]
  39. );
  40. dom.mark_dirty(ScopeId(0));
  41. assert_eq!(
  42. dom.render_immediate().santize().edits,
  43. [
  44. LoadTemplate { name: "template", index: 0, id: ElementId(3) },
  45. ReplaceWith { id: ElementId(2), m: 1 }
  46. ]
  47. );
  48. dom.mark_dirty(ScopeId(0));
  49. assert_eq!(
  50. dom.render_immediate().santize().edits,
  51. [
  52. LoadTemplate { name: "template", index: 0, id: ElementId(2) },
  53. AssignId { path: &[0], id: ElementId(1) },
  54. SetAttribute { name: "class", value: "3", id: ElementId(1), ns: None },
  55. SetAttribute { name: "id", value: "3", id: ElementId(1), ns: None },
  56. ReplaceWith { id: ElementId(3), m: 1 }
  57. ]
  58. );
  59. // we take the node taken by attributes since we reused it
  60. dom.mark_dirty(ScopeId(0));
  61. assert_eq!(
  62. dom.render_immediate().santize().edits,
  63. [
  64. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  65. ReplaceWith { id: ElementId(2), m: 1 }
  66. ]
  67. );
  68. }