attr_cleanup.rs 2.5 KB

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