attr_cleanup.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. use dioxus_core::BorrowedAttributeValue;
  8. #[test]
  9. fn attrs_cycle() {
  10. let mut dom = VirtualDom::new(|cx| {
  11. let id = cx.generation();
  12. match cx.generation() % 2 {
  13. 0 => cx.render(rsx! {
  14. div {}
  15. }),
  16. 1 => cx.render(rsx! {
  17. div {
  18. h1 { class: "{id}", id: "{id}" }
  19. }
  20. }),
  21. _ => unreachable!(),
  22. }
  23. });
  24. let bump = Bump::new();
  25. assert_eq!(
  26. dom.rebuild().santize().edits,
  27. [
  28. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  29. AppendChildren { m: 1, id: ElementId(0) },
  30. ]
  31. );
  32. dom.mark_dirty(ScopeId(0));
  33. assert_eq!(
  34. dom.render_immediate().santize().edits,
  35. [
  36. LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
  37. AssignId { path: &[0,], id: ElementId(3,) },
  38. SetAttribute {
  39. name: "class",
  40. value: (&*bump.alloc("1".into_value(&bump))).into(),
  41. id: ElementId(3,),
  42. ns: None
  43. },
  44. SetAttribute {
  45. name: "id",
  46. value: (&*bump.alloc("1".into_value(&bump))).into(),
  47. id: ElementId(3,),
  48. ns: None
  49. },
  50. ReplaceWith { id: ElementId(1,), m: 1 },
  51. ]
  52. );
  53. dom.mark_dirty(ScopeId(0));
  54. assert_eq!(
  55. dom.render_immediate().santize().edits,
  56. [
  57. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  58. ReplaceWith { id: ElementId(2), m: 1 }
  59. ]
  60. );
  61. dom.mark_dirty(ScopeId(0));
  62. assert_eq!(
  63. dom.render_immediate().santize().edits,
  64. [
  65. LoadTemplate { name: "template", index: 0, id: ElementId(2) },
  66. AssignId { path: &[0], id: ElementId(3) },
  67. SetAttribute {
  68. name: "class",
  69. value: BorrowedAttributeValue::Text("3"),
  70. id: ElementId(3),
  71. ns: None
  72. },
  73. SetAttribute {
  74. name: "id",
  75. value: BorrowedAttributeValue::Text("3"),
  76. id: ElementId(3),
  77. ns: None
  78. },
  79. ReplaceWith { id: ElementId(1), m: 1 }
  80. ]
  81. );
  82. // we take the node taken by attributes since we reused it
  83. dom.mark_dirty(ScopeId(0));
  84. assert_eq!(
  85. dom.render_immediate().santize().edits,
  86. [
  87. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  88. ReplaceWith { id: ElementId(2), m: 1 }
  89. ]
  90. );
  91. }