create_dom.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #![allow(unused, non_upper_case_globals, non_snake_case)]
  2. //! Prove that the dom works normally through virtualdom methods.
  3. //!
  4. //! This methods all use "rebuild_to_vec" which completely bypasses the scheduler.
  5. //! Hard rebuild_to_vecs don't consume any events from the event queue.
  6. use dioxus::dioxus_core::Mutation::*;
  7. use dioxus::prelude::*;
  8. use dioxus_core::ElementId;
  9. #[test]
  10. fn test_original_diff() {
  11. let mut dom = VirtualDom::new(|| {
  12. render! {
  13. div { div { "Hello, world!" } }
  14. }
  15. });
  16. let edits = dom.rebuild_to_vec().santize();
  17. assert_eq!(
  18. edits.edits,
  19. [
  20. // add to root
  21. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  22. AppendChildren { m: 1, id: ElementId(0) }
  23. ]
  24. )
  25. }
  26. #[test]
  27. fn create() {
  28. let mut dom = VirtualDom::new(|| {
  29. render! {
  30. div {
  31. div {
  32. "Hello, world!"
  33. div {
  34. div {
  35. Fragment { "hello""world" }
  36. }
  37. }
  38. }
  39. }
  40. }
  41. });
  42. let _edits = dom.rebuild_to_vec().santize();
  43. // todo: we don't test template mutations anymore since the templates are passed along
  44. // assert_eq!(
  45. // edits.templates,
  46. // [
  47. // // create template
  48. // CreateElement { name: "div" },
  49. // CreateElement { name: "div" },
  50. // CreateStaticText { value: "Hello, world!" },
  51. // CreateElement { name: "div" },
  52. // CreateElement { name: "div" },
  53. // CreateStaticPlaceholder {},
  54. // AppendChildren { m: 1 },
  55. // AppendChildren { m: 1 },
  56. // AppendChildren { m: 2 },
  57. // AppendChildren { m: 1 },
  58. // SaveTemplate { name: "template", m: 1 },
  59. // // The fragment child template
  60. // CreateStaticText { value: "hello" },
  61. // CreateStaticText { value: "world" },
  62. // SaveTemplate { name: "template", m: 2 },
  63. // ]
  64. // );
  65. }
  66. #[test]
  67. fn create_list() {
  68. let mut dom = VirtualDom::new(|| render! {{(0..3).map(|f| render!( div { "hello" } ))}});
  69. let _edits = dom.rebuild_to_vec().santize();
  70. // note: we dont test template edits anymore
  71. // assert_eq!(
  72. // edits.templates,
  73. // [
  74. // // create template
  75. // CreateElement { name: "div" },
  76. // CreateStaticText { value: "hello" },
  77. // AppendChildren { m: 1 },
  78. // SaveTemplate { name: "template", m: 1 }
  79. // ]
  80. // );
  81. }
  82. #[test]
  83. fn create_simple() {
  84. let mut dom = VirtualDom::new(|| {
  85. render! {
  86. div {}
  87. div {}
  88. div {}
  89. div {}
  90. }
  91. });
  92. let edits = dom.rebuild_to_vec().santize();
  93. // note: we dont test template edits anymore
  94. // assert_eq!(
  95. // edits.templates,
  96. // [
  97. // // create template
  98. // CreateElement { name: "div" },
  99. // CreateElement { name: "div" },
  100. // CreateElement { name: "div" },
  101. // CreateElement { name: "div" },
  102. // // add to root
  103. // SaveTemplate { name: "template", m: 4 }
  104. // ]
  105. // );
  106. }
  107. #[test]
  108. fn create_components() {
  109. let mut dom = VirtualDom::new(|| {
  110. render! {
  111. Child { "abc1" }
  112. Child { "abc2" }
  113. Child { "abc3" }
  114. }
  115. });
  116. #[derive(Props, Clone, PartialEq)]
  117. struct ChildProps {
  118. children: Element,
  119. }
  120. fn Child(cx: ChildProps) -> Element {
  121. render! {
  122. h1 {}
  123. div { {cx.children} }
  124. p {}
  125. }
  126. }
  127. let _edits = dom.rebuild_to_vec().santize();
  128. // todo: test this
  129. }
  130. #[test]
  131. fn anchors() {
  132. let mut dom = VirtualDom::new(|| {
  133. render! {
  134. if true {
  135. div { "hello" }
  136. }
  137. if false {
  138. div { "goodbye" }
  139. }
  140. }
  141. });
  142. // note that the template under "false" doesn't show up since it's not loaded
  143. let edits = dom.rebuild_to_vec().santize();
  144. // note: we dont test template edits anymore
  145. // assert_eq!(
  146. // edits.templates,
  147. // [
  148. // // create each template
  149. // CreateElement { name: "div" },
  150. // CreateStaticText { value: "hello" },
  151. // AppendChildren { m: 1 },
  152. // SaveTemplate { m: 1, name: "template" },
  153. // ]
  154. // );
  155. assert_eq!(
  156. edits.edits,
  157. [
  158. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  159. CreatePlaceholder { id: ElementId(2) },
  160. AppendChildren { m: 2, id: ElementId(0) }
  161. ]
  162. )
  163. }