change_nodes.rs 3.6 KB

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