create_dom.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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.edits,
  23. [
  24. // add to root
  25. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  26. AppendChildren { m: 1, id: ElementId(0) }
  27. ]
  28. )
  29. }
  30. #[test]
  31. fn create() {
  32. let mut dom = VirtualDom::new(|cx| {
  33. cx.render(rsx! {
  34. div {
  35. div {
  36. "Hello, world!"
  37. div {
  38. div {
  39. Fragment {
  40. "hello"
  41. "world"
  42. }
  43. }
  44. }
  45. }
  46. }
  47. })
  48. });
  49. let _edits = dom.rebuild().santize();
  50. // todo: we don't test template mutations anymore since the templates are passed along
  51. // assert_eq!(
  52. // edits.templates,
  53. // [
  54. // // create template
  55. // CreateElement { name: "div" },
  56. // CreateElement { name: "div" },
  57. // CreateStaticText { value: "Hello, world!" },
  58. // CreateElement { name: "div" },
  59. // CreateElement { name: "div" },
  60. // CreateStaticPlaceholder {},
  61. // AppendChildren { m: 1 },
  62. // AppendChildren { m: 1 },
  63. // AppendChildren { m: 2 },
  64. // AppendChildren { m: 1 },
  65. // SaveTemplate { name: "template", m: 1 },
  66. // // The fragment child template
  67. // CreateStaticText { value: "hello" },
  68. // CreateStaticText { value: "world" },
  69. // SaveTemplate { name: "template", m: 2 },
  70. // ]
  71. // );
  72. }
  73. #[test]
  74. fn create_list() {
  75. let mut dom = VirtualDom::new(|cx| {
  76. cx.render(rsx! {
  77. (0..3).map(|f| rsx!( div { "hello" } ))
  78. })
  79. });
  80. let _edits = dom.rebuild().santize();
  81. // note: we dont test template edits anymore
  82. // assert_eq!(
  83. // edits.templates,
  84. // [
  85. // // create template
  86. // CreateElement { name: "div" },
  87. // CreateStaticText { value: "hello" },
  88. // AppendChildren { m: 1 },
  89. // SaveTemplate { name: "template", m: 1 }
  90. // ]
  91. // );
  92. }
  93. #[test]
  94. fn create_simple() {
  95. let mut dom = VirtualDom::new(|cx| {
  96. cx.render(rsx! {
  97. div {}
  98. div {}
  99. div {}
  100. div {}
  101. })
  102. });
  103. let edits = dom.rebuild().santize();
  104. // note: we dont test template edits anymore
  105. // assert_eq!(
  106. // edits.templates,
  107. // [
  108. // // create template
  109. // CreateElement { name: "div" },
  110. // CreateElement { name: "div" },
  111. // CreateElement { name: "div" },
  112. // CreateElement { name: "div" },
  113. // // add to root
  114. // SaveTemplate { name: "template", m: 4 }
  115. // ]
  116. // );
  117. }
  118. #[test]
  119. fn create_components() {
  120. let mut dom = VirtualDom::new(|cx| {
  121. cx.render(rsx! {
  122. Child { "abc1" }
  123. Child { "abc2" }
  124. Child { "abc3" }
  125. })
  126. });
  127. #[derive(Props)]
  128. struct ChildProps<'a> {
  129. children: Element<'a>,
  130. }
  131. fn Child<'a>(cx: Scope<'a, ChildProps<'a>>) -> Element {
  132. cx.render(rsx! {
  133. h1 {}
  134. div { &cx.props.children }
  135. p {}
  136. })
  137. }
  138. let _edits = dom.rebuild().santize();
  139. // todo: test this
  140. }
  141. #[test]
  142. fn anchors() {
  143. let mut dom = VirtualDom::new(|cx| {
  144. cx.render(rsx! {
  145. if true {
  146. rsx!( div { "hello" } )
  147. }
  148. if false {
  149. rsx!( div { "goodbye" } )
  150. }
  151. })
  152. });
  153. // note that the template under "false" doesn't show up since it's not loaded
  154. let edits = dom.rebuild().santize();
  155. // note: we dont test template edits anymore
  156. // assert_eq!(
  157. // edits.templates,
  158. // [
  159. // // create each template
  160. // CreateElement { name: "div" },
  161. // CreateStaticText { value: "hello" },
  162. // AppendChildren { m: 1 },
  163. // SaveTemplate { m: 1, name: "template" },
  164. // ]
  165. // );
  166. assert_eq!(
  167. edits.edits,
  168. [
  169. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  170. CreatePlaceholder { id: ElementId(2) },
  171. AppendChildren { m: 2, id: ElementId(0) }
  172. ]
  173. )
  174. }