attr_cleanup.rs 2.7 KB

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