change_nodes.rs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. use dioxus_core::VNode;
  2. use dioxus_core::*;
  3. use dioxus_core_macro::*;
  4. use dioxus_html as dioxus_elements;
  5. use dioxus_native_core::real_dom::RealDom;
  6. use dioxus_native_core::state::State;
  7. use dioxus_native_core_macro::State;
  8. use std::cell::Cell;
  9. #[derive(State, Default, Clone)]
  10. struct Empty {}
  11. #[test]
  12. fn remove_node() {
  13. #[allow(non_snake_case)]
  14. fn Base(cx: Scope) -> Element {
  15. rsx!(cx, div {})
  16. }
  17. let vdom = VirtualDom::new(Base);
  18. let mutations = vdom.create_vnodes(rsx! {
  19. div{
  20. div{}
  21. }
  22. });
  23. let mut dom: RealDom<Empty> = RealDom::new();
  24. let _to_update = dom.apply_mutations(vec![mutations]);
  25. let child_div = VElement {
  26. id: Cell::new(Some(ElementId(2))),
  27. key: None,
  28. tag: "div",
  29. namespace: None,
  30. parent: Cell::new(Some(ElementId(1))),
  31. listeners: &[],
  32. attributes: &[],
  33. children: &[],
  34. };
  35. let child_div_el = VNode::Element(&child_div);
  36. let root_div = VElement {
  37. id: Cell::new(Some(ElementId(1))),
  38. key: None,
  39. tag: "div",
  40. namespace: None,
  41. parent: Cell::new(Some(ElementId(0))),
  42. listeners: &[],
  43. attributes: &[],
  44. children: &[child_div_el],
  45. };
  46. assert_eq!(dom.size(), 2);
  47. assert!(&dom.contains_node(&VNode::Element(&root_div)));
  48. assert_eq!(dom[1].height, 1);
  49. assert_eq!(dom[2].height, 2);
  50. let vdom = VirtualDom::new(Base);
  51. let mutations = vdom.diff_lazynodes(
  52. rsx! {
  53. div{
  54. div{}
  55. }
  56. },
  57. rsx! {
  58. div{}
  59. },
  60. );
  61. dom.apply_mutations(vec![mutations.1]);
  62. let new_root_div = VElement {
  63. id: Cell::new(Some(ElementId(1))),
  64. key: None,
  65. tag: "div",
  66. namespace: None,
  67. parent: Cell::new(Some(ElementId(0))),
  68. listeners: &[],
  69. attributes: &[],
  70. children: &[],
  71. };
  72. assert_eq!(dom.size(), 1);
  73. assert!(&dom.contains_node(&VNode::Element(&new_root_div)));
  74. assert_eq!(dom[1].height, 1);
  75. }
  76. #[test]
  77. fn add_node() {
  78. #[allow(non_snake_case)]
  79. fn Base(cx: Scope) -> Element {
  80. rsx!(cx, div {})
  81. }
  82. let vdom = VirtualDom::new(Base);
  83. let mutations = vdom.create_vnodes(rsx! {
  84. div{}
  85. });
  86. let mut dom: RealDom<Empty> = RealDom::new();
  87. let _to_update = dom.apply_mutations(vec![mutations]);
  88. let root_div = VElement {
  89. id: Cell::new(Some(ElementId(1))),
  90. key: None,
  91. tag: "div",
  92. namespace: None,
  93. parent: Cell::new(Some(ElementId(0))),
  94. listeners: &[],
  95. attributes: &[],
  96. children: &[],
  97. };
  98. assert_eq!(dom.size(), 1);
  99. assert!(&dom.contains_node(&VNode::Element(&root_div)));
  100. assert_eq!(dom[1].height, 1);
  101. let vdom = VirtualDom::new(Base);
  102. let mutations = vdom.diff_lazynodes(
  103. rsx! {
  104. div{}
  105. },
  106. rsx! {
  107. div{
  108. p{}
  109. }
  110. },
  111. );
  112. dom.apply_mutations(vec![mutations.1]);
  113. let child_div = VElement {
  114. id: Cell::new(Some(ElementId(2))),
  115. key: None,
  116. tag: "p",
  117. namespace: None,
  118. parent: Cell::new(Some(ElementId(1))),
  119. listeners: &[],
  120. attributes: &[],
  121. children: &[],
  122. };
  123. let child_div_el = VNode::Element(&child_div);
  124. let new_root_div = VElement {
  125. id: Cell::new(Some(ElementId(1))),
  126. key: None,
  127. tag: "div",
  128. namespace: None,
  129. parent: Cell::new(Some(ElementId(0))),
  130. listeners: &[],
  131. attributes: &[],
  132. children: &[child_div_el],
  133. };
  134. assert_eq!(dom.size(), 2);
  135. assert!(&dom.contains_node(&VNode::Element(&new_root_div)));
  136. assert_eq!(dom[1].height, 1);
  137. assert_eq!(dom[2].height, 2);
  138. }