rsx_syntax.rs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. fn basic_syntax_is_a_template(cx: Scope) -> Element {
  2. let asd = 123;
  3. let var = 123;
  4. cx.render(rsx! {
  5. div { key: "12345",
  6. class: "asd",
  7. class: "{asd}",
  8. onclick: move |_| {},
  9. div { "{var}" }
  10. div {
  11. h1 { "var" }
  12. p { "you're great!" }
  13. div { background_color: "red",
  14. h1 { "var" }
  15. div { b { "asd" } "not great" }
  16. }
  17. p { "you're great!" }
  18. }
  19. }
  20. })
  21. }
  22. // imports come after the test since the rsx! macro is sensitive to its location in the file
  23. // (the byte index is used to differentiate sub templates)
  24. use dioxus::core::{ElementId, Mutation};
  25. use dioxus::prelude::*;
  26. #[test]
  27. fn dual_stream() {
  28. let mut dom = VirtualDom::new(basic_syntax_is_a_template);
  29. let edits = dom.rebuild();
  30. use Mutation::*;
  31. assert_eq!(
  32. edits.template_mutations,
  33. vec![
  34. CreateElement { name: "div", namespace: None, id: ElementId(1) },
  35. SetAttribute { name: "class", value: "asd", id: ElementId(1) },
  36. CreateElement { name: "div", namespace: None, id: ElementId(2) },
  37. CreatePlaceholder { id: ElementId(3) },
  38. AppendChildren { m: 1 },
  39. CreateElement { name: "div", namespace: None, id: ElementId(4) },
  40. CreateElement { name: "h1", namespace: None, id: ElementId(5) },
  41. CreateTextNode { value: "var" },
  42. AppendChildren { m: 1 },
  43. CreateElement { name: "p", namespace: None, id: ElementId(6) },
  44. CreateTextNode { value: "you're great!" },
  45. AppendChildren { m: 1 },
  46. CreateElement { name: "div", namespace: None, id: ElementId(7) },
  47. SetAttribute { name: "background-color", value: "red", id: ElementId(7) },
  48. CreateElement { name: "h1", namespace: None, id: ElementId(8) },
  49. CreateTextNode { value: "var" },
  50. AppendChildren { m: 1 },
  51. CreateElement { name: "div", namespace: None, id: ElementId(9) },
  52. CreateElement { name: "b", namespace: None, id: ElementId(10) },
  53. CreateTextNode { value: "asd" },
  54. AppendChildren { m: 1 },
  55. CreateTextNode { value: "not great" },
  56. AppendChildren { m: 2 },
  57. AppendChildren { m: 2 },
  58. CreateElement { name: "p", namespace: None, id: ElementId(11) },
  59. CreateTextNode { value: "you're great!" },
  60. AppendChildren { m: 1 },
  61. AppendChildren { m: 4 },
  62. AppendChildren { m: 2 },
  63. SaveTemplate { name: "packages/dioxus/tests/rsx_syntax.rs:5:15:122", m: 1 }
  64. ]
  65. );
  66. assert_eq!(
  67. edits.edits,
  68. vec![
  69. LoadTemplate { name: "packages/dioxus/tests/rsx_syntax.rs:5:15:122", index: 0 },
  70. AssignId { path: &[], id: ElementId(12) },
  71. SetAttribute { name: "class", value: "123", id: ElementId(12) },
  72. SetAttribute { name: "onclick", value: "asd", id: ElementId(12) }, // ---- todo: listeners
  73. HydrateText { path: &[0, 0], value: "123", id: ElementId(13) },
  74. ReplacePlaceholder { m: 1, path: &[0, 0] },
  75. AppendChildren { m: 1 }
  76. ]
  77. );
  78. }