attr_cleanup.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //! dynamic attributes in dioxus necessitate an allocated node ID.
  2. //!
  3. //! This tests to ensure we clean it up
  4. use dioxus::core::{ElementId, Mutation::*};
  5. use dioxus::prelude::*;
  6. #[test]
  7. fn attrs_cycle() {
  8. let mut dom = VirtualDom::new(|cx| {
  9. let id = cx.generation();
  10. match cx.generation() % 2 {
  11. 0 => cx.render(rsx! {
  12. div {}
  13. }),
  14. 1 => cx.render(rsx! {
  15. div {
  16. h1 { class: "{id}", id: "{id}" }
  17. }
  18. }),
  19. _ => unreachable!(),
  20. }
  21. });
  22. assert_eq!(
  23. dom.rebuild().santize().edits,
  24. [
  25. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  26. AppendChildren { m: 1 },
  27. ]
  28. );
  29. dom.mark_dirty_scope(ScopeId(0));
  30. assert_eq!(
  31. dom.render_immediate().santize().edits,
  32. [
  33. LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
  34. AssignId { path: &[0,], id: ElementId(3,) },
  35. SetAttribute { name: "class", value: "1", id: ElementId(3,), ns: None },
  36. SetAttribute { name: "id", value: "1", id: ElementId(3,), ns: None },
  37. ReplaceWith { id: ElementId(1,), m: 1 },
  38. ]
  39. );
  40. dom.mark_dirty_scope(ScopeId(0));
  41. dbg!(
  42. dom.render_immediate().santize(),
  43. [
  44. LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
  45. ReplaceWith { id: ElementId(2,), m: 1 },
  46. ]
  47. );
  48. dom.mark_dirty_scope(ScopeId(0));
  49. assert_eq!(
  50. dom.render_immediate().santize().edits,
  51. [
  52. LoadTemplate { name: "template", index: 0, id: ElementId(2) },
  53. AssignId { path: &[0], id: ElementId(1) },
  54. SetAttribute { name: "class", value: "3", id: ElementId(1), ns: None },
  55. SetAttribute { name: "id", value: "3", id: ElementId(1), ns: None },
  56. ReplaceWith { id: ElementId(3), m: 1 }
  57. ]
  58. );
  59. }