attr_cleanup.rs 2.5 KB

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