attr_cleanup.rs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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(1) },
  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(3) },
  61. SetAttribute { name: "class", value: "3", id: ElementId(3), ns: None },
  62. SetAttribute { name: "id", value: "3", id: ElementId(3), ns: None },
  63. ReplaceWith { id: ElementId(1), m: 1 }
  64. ]
  65. );
  66. // we take the node taken by attributes since we reused it
  67. dom.mark_dirty(ScopeId(0));
  68. assert_eq!(
  69. dom.render_immediate().santize().edits,
  70. [
  71. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  72. ReplaceWith { id: ElementId(2), m: 1 }
  73. ]
  74. );
  75. }