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 dioxus::dioxus_core::{ElementId, Mutation::*};
  5. use dioxus::prelude::*;
  6. #[test]
  7. fn attrs_cycle() {
  8. tracing_subscriber::fmt::init();
  9. let mut dom = VirtualDom::new(|| {
  10. let id = generation();
  11. match id % 2 {
  12. 0 => rsx! { div {} },
  13. 1 => rsx! {
  14. div { h1 { class: "{id}", id: "{id}" } }
  15. },
  16. _ => unreachable!(),
  17. }
  18. });
  19. assert_eq!(
  20. dom.rebuild_to_vec().edits,
  21. [
  22. LoadTemplate { index: 0, id: ElementId(1,) },
  23. AppendChildren { m: 1, id: ElementId(0) },
  24. ]
  25. );
  26. dom.mark_dirty(ScopeId::APP);
  27. assert_eq!(
  28. dom.render_immediate_to_vec().edits,
  29. [
  30. LoadTemplate { index: 0, id: ElementId(2,) },
  31. AssignId { path: &[0,], id: ElementId(3,) },
  32. SetAttribute { name: "class", value: "1".into_value(), id: ElementId(3,), ns: None },
  33. SetAttribute { name: "id", value: "1".into_value(), id: ElementId(3,), ns: None },
  34. ReplaceWith { id: ElementId(1,), m: 1 },
  35. ]
  36. );
  37. dom.mark_dirty(ScopeId::APP);
  38. assert_eq!(
  39. dom.render_immediate_to_vec().edits,
  40. [
  41. LoadTemplate { index: 0, id: ElementId(1) },
  42. ReplaceWith { id: ElementId(2), m: 1 }
  43. ]
  44. );
  45. dom.mark_dirty(ScopeId::APP);
  46. assert_eq!(
  47. dom.render_immediate_to_vec().edits,
  48. [
  49. LoadTemplate { index: 0, id: ElementId(2) },
  50. AssignId { path: &[0], id: ElementId(3) },
  51. SetAttribute {
  52. name: "class",
  53. value: dioxus_core::AttributeValue::Text("3".to_string()),
  54. id: ElementId(3),
  55. ns: None
  56. },
  57. SetAttribute {
  58. name: "id",
  59. value: dioxus_core::AttributeValue::Text("3".to_string()),
  60. id: ElementId(3),
  61. ns: None
  62. },
  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::APP);
  68. assert_eq!(
  69. dom.render_immediate_to_vec().edits,
  70. [
  71. LoadTemplate { index: 0, id: ElementId(1) },
  72. ReplaceWith { id: ElementId(2), m: 1 }
  73. ]
  74. );
  75. }