create_dom.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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" which completely bypasses the scheduler.
  5. //! Hard rebuilds don't consume any events from the event queue.
  6. use 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(|cx| {
  12. cx.render(rsx! {
  13. div {
  14. div {
  15. "Hello, world!"
  16. }
  17. }
  18. })
  19. });
  20. let edits = dom.rebuild().santize();
  21. assert_eq!(
  22. edits.template_edits,
  23. [
  24. // create template
  25. CreateElement { name: "div" },
  26. CreateElement { name: "div" },
  27. CreateStaticText { value: "Hello, world!" },
  28. AppendChildren { m: 1 },
  29. AppendChildren { m: 1 },
  30. SaveTemplate { name: "template", m: 1 },
  31. ]
  32. );
  33. assert_eq!(
  34. edits.dom_edits,
  35. [
  36. // add to root
  37. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  38. AppendChildren { m: 1 }
  39. ]
  40. )
  41. }
  42. #[test]
  43. fn create() {
  44. let mut dom = VirtualDom::new(|cx| {
  45. cx.render(rsx! {
  46. div {
  47. div {
  48. "Hello, world!"
  49. div {
  50. div {
  51. Fragment {
  52. "hello"
  53. "world"
  54. }
  55. }
  56. }
  57. }
  58. }
  59. })
  60. });
  61. let edits = dom.rebuild().santize();
  62. assert_eq!(
  63. edits.template_edits,
  64. [
  65. // create template
  66. CreateElement { name: "div" },
  67. CreateElement { name: "div" },
  68. CreateStaticText { value: "Hello, world!" },
  69. CreateElement { name: "div" },
  70. CreateElement { name: "div" },
  71. CreateStaticPlaceholder {},
  72. AppendChildren { m: 1 },
  73. AppendChildren { m: 1 },
  74. AppendChildren { m: 2 },
  75. AppendChildren { m: 1 },
  76. SaveTemplate { name: "template", m: 1 },
  77. // The fragment child template
  78. CreateStaticText { value: "hello" },
  79. CreateStaticText { value: "world" },
  80. SaveTemplate { name: "template", m: 2 },
  81. ]
  82. );
  83. }
  84. #[test]
  85. fn create_list() {
  86. let mut dom = VirtualDom::new(|cx| {
  87. cx.render(rsx! {
  88. (0..3).map(|f| rsx!( div { "hello" } ))
  89. })
  90. });
  91. let edits = dom.rebuild().santize();
  92. assert_eq!(
  93. edits.template_edits,
  94. [
  95. // create template
  96. CreateElement { name: "div" },
  97. CreateStaticText { value: "hello" },
  98. AppendChildren { m: 1 },
  99. SaveTemplate { name: "template", m: 1 }
  100. ]
  101. );
  102. }
  103. #[test]
  104. fn create_simple() {
  105. let mut dom = VirtualDom::new(|cx| {
  106. cx.render(rsx! {
  107. div {}
  108. div {}
  109. div {}
  110. div {}
  111. })
  112. });
  113. let edits = dom.rebuild().santize();
  114. assert_eq!(
  115. edits.template_edits,
  116. [
  117. // create template
  118. CreateElement { name: "div" },
  119. CreateElement { name: "div" },
  120. CreateElement { name: "div" },
  121. CreateElement { name: "div" },
  122. // add to root
  123. SaveTemplate { name: "template", m: 4 }
  124. ]
  125. );
  126. }
  127. #[test]
  128. fn create_components() {
  129. let mut dom = VirtualDom::new(|cx| {
  130. cx.render(rsx! {
  131. Child { "abc1" }
  132. Child { "abc2" }
  133. Child { "abc3" }
  134. })
  135. });
  136. #[derive(Props)]
  137. struct ChildProps<'a> {
  138. children: Element<'a>,
  139. }
  140. fn Child<'a>(cx: Scope<'a, ChildProps<'a>>) -> Element {
  141. cx.render(rsx! {
  142. h1 {}
  143. div { &cx.props.children }
  144. p {}
  145. })
  146. }
  147. let edits = dom.rebuild().santize();
  148. assert_eq!(
  149. edits.template_edits,
  150. [
  151. // The "child" template
  152. CreateElement { name: "h1" },
  153. CreateElement { name: "div" },
  154. CreateStaticPlaceholder {},
  155. AppendChildren { m: 1 },
  156. CreateElement { name: "p" },
  157. SaveTemplate { name: "template", m: 3 },
  158. // Sub template for component children
  159. CreateStaticText { value: "abc1" },
  160. SaveTemplate { name: "template", m: 1 },
  161. CreateStaticText { value: "abc2" },
  162. SaveTemplate { name: "template", m: 1 },
  163. CreateStaticText { value: "abc3" },
  164. SaveTemplate { name: "template", m: 1 }
  165. ]
  166. );
  167. }
  168. #[test]
  169. fn anchors() {
  170. let mut dom = VirtualDom::new(|cx| {
  171. cx.render(rsx! {
  172. if true {
  173. rsx!( div { "hello" } )
  174. }
  175. if false {
  176. rsx!( div { "goodbye" } )
  177. }
  178. })
  179. });
  180. // note that the template under "false" doesn't show up since it's not loaded
  181. let edits = dom.rebuild().santize();
  182. assert_eq!(
  183. edits.template_edits,
  184. [
  185. // create each template
  186. CreateElement { name: "div" },
  187. CreateStaticText { value: "hello" },
  188. AppendChildren { m: 1 },
  189. SaveTemplate { m: 1, name: "template" },
  190. ]
  191. );
  192. assert_eq!(
  193. edits.dom_edits,
  194. [
  195. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  196. CreatePlaceholder { id: ElementId(2) },
  197. AppendChildren { m: 2 }
  198. ]
  199. )
  200. }