initial_build.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. use std::cell::Cell;
  2. use dioxus::core as dioxus_core;
  3. use dioxus::core::{ElementId, VElement, VText};
  4. use dioxus::prelude::*;
  5. use dioxus_native_core::real_dom::RealDom;
  6. use dioxus_native_core::state::State;
  7. use dioxus_native_core_macro::State;
  8. #[derive(Default, Clone, State)]
  9. struct Empty {}
  10. #[test]
  11. fn initial_build_simple() {
  12. use std::cell::Cell;
  13. #[allow(non_snake_case)]
  14. fn Base(cx: Scope) -> Element {
  15. render!(div {})
  16. }
  17. let vdom = VirtualDom::new(Base);
  18. let mutations = vdom.create_vnodes(rsx! {
  19. div{}
  20. });
  21. let mut dom: RealDom<Empty> = RealDom::new();
  22. let _to_update = dom.apply_mutations(vec![mutations]);
  23. let root_div = VElement {
  24. id: Cell::new(Some(ElementId(1))),
  25. key: None,
  26. tag: "div",
  27. namespace: None,
  28. parent: Cell::new(Some(ElementId(0))),
  29. listeners: &[],
  30. attributes: &[],
  31. children: &[],
  32. };
  33. assert_eq!(dom.size(), 1);
  34. assert!(&dom.contains_node(&VNode::Element(&root_div)));
  35. assert_eq!(dom[ElementId(1)].height, 1);
  36. }
  37. #[test]
  38. fn initial_build_with_children() {
  39. #[allow(non_snake_case)]
  40. fn Base(cx: Scope) -> Element {
  41. render!(div {})
  42. }
  43. let vdom = VirtualDom::new(Base);
  44. let mutations = vdom.create_vnodes(rsx! {
  45. div{
  46. div{
  47. "hello"
  48. p{
  49. "world"
  50. }
  51. "hello world"
  52. }
  53. }
  54. });
  55. let mut dom: RealDom<Empty> = RealDom::new();
  56. let _to_update = dom.apply_mutations(vec![mutations]);
  57. let first_text = VText {
  58. id: Cell::new(Some(ElementId(3))),
  59. text: "hello",
  60. is_static: true,
  61. };
  62. let first_text_node = VNode::Text(&first_text);
  63. let child_text = VText {
  64. id: Cell::new(Some(ElementId(5))),
  65. text: "world",
  66. is_static: true,
  67. };
  68. let child_text_node = VNode::Text(&child_text);
  69. let child_p_el = VElement {
  70. id: Cell::new(Some(ElementId(4))),
  71. key: None,
  72. tag: "p",
  73. namespace: None,
  74. parent: Cell::new(Some(ElementId(2))),
  75. listeners: &[],
  76. attributes: &[],
  77. children: &[child_text_node],
  78. };
  79. let child_p_node = VNode::Element(&child_p_el);
  80. let second_text = VText {
  81. id: Cell::new(Some(ElementId(6))),
  82. text: "hello world",
  83. is_static: true,
  84. };
  85. let second_text_node = VNode::Text(&second_text);
  86. let child_div_el = VElement {
  87. id: Cell::new(Some(ElementId(2))),
  88. key: None,
  89. tag: "div",
  90. namespace: None,
  91. parent: Cell::new(Some(ElementId(1))),
  92. listeners: &[],
  93. attributes: &[],
  94. children: &[first_text_node, child_p_node, second_text_node],
  95. };
  96. let child_div_node = VNode::Element(&child_div_el);
  97. let root_div = VElement {
  98. id: Cell::new(Some(ElementId(1))),
  99. key: None,
  100. tag: "div",
  101. namespace: None,
  102. parent: Cell::new(Some(ElementId(0))),
  103. listeners: &[],
  104. attributes: &[],
  105. children: &[child_div_node],
  106. };
  107. assert_eq!(dom.size(), 6);
  108. assert!(&dom.contains_node(&VNode::Element(&root_div)));
  109. assert_eq!(dom[ElementId(1)].height, 1);
  110. assert_eq!(dom[ElementId(2)].height, 2);
  111. assert_eq!(dom[ElementId(3)].height, 3);
  112. assert_eq!(dom[ElementId(4)].height, 3);
  113. assert_eq!(dom[ElementId(5)].height, 4);
  114. assert_eq!(dom[ElementId(6)].height, 3);
  115. }