rsx.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #[test]
  2. fn rsx() {
  3. let t = trybuild::TestCases::new();
  4. t.compile_fail("tests/rsx/trailing-comma-0.rs");
  5. }
  6. /// This test ensures that automatic `into` conversion occurs for default values.
  7. ///
  8. /// These are compile-time tests.
  9. /// See https://github.com/DioxusLabs/dioxus/issues/2373
  10. #[cfg(test)]
  11. mod test_default_into {
  12. use dioxus::prelude::*;
  13. #[derive(Props, Clone, PartialEq)]
  14. struct MyCoolProps {
  15. // Test different into configurations
  16. #[props(into, default = true)]
  17. pub val_into_w_default_val: u16,
  18. #[props(into, default)]
  19. pub val_into_w_default: u16,
  20. #[props(default = true.into())]
  21. pub val_default: u16,
  22. // Test different into configurations with strings
  23. #[props(into, default = "abc")]
  24. pub str_into_w_default_val: String,
  25. #[props(into, default)]
  26. pub str_into_w_default: String,
  27. #[props(default = "abc".into())]
  28. pub str_default: String,
  29. // Test options
  30. #[props(into, default = Some("abc"))]
  31. pub opt_into_w_default_val: Option<String>,
  32. #[props(into, default)]
  33. pub opt_into_w_default: Option<String>,
  34. #[props(default = Some("abc"))]
  35. pub opt_default: Option<String>,
  36. // Test no default
  37. #[props(into)]
  38. pub some_data: bool,
  39. pub some_other_data: bool,
  40. // Test default values for signals
  41. #[props(default)]
  42. read_only_w_default: ReadOnlySignal<bool>,
  43. #[props(default = true)]
  44. read_only_w_default_val: ReadOnlySignal<bool>,
  45. #[props(default = ReadOnlySignal::new(Signal::new(true)))]
  46. read_only_w_default_val_explicit: ReadOnlySignal<bool>,
  47. // Test default values for callbacks/event handlers
  48. #[props(default)]
  49. callback_w_default: Callback,
  50. #[props(default = move |_| {})]
  51. callback_w_default_val_closure: Callback,
  52. #[props(default = {
  53. fn test(_: ()) {}
  54. test
  55. })]
  56. callback_w_default_val_expr_fn: Callback,
  57. #[props(default = Callback::new(move |_: ()| {}))]
  58. callback_w_default_val_explicit: Callback,
  59. #[props(default)]
  60. event_handler_w_default: EventHandler<KeyboardEvent>,
  61. #[props(default = move |_| {})]
  62. event_handler_w_default_val_closure: EventHandler<KeyboardEvent>,
  63. #[props(default = {
  64. fn test(_: KeyboardEvent) {}
  65. test
  66. })]
  67. event_handler_w_default_val_expr_fn: EventHandler<KeyboardEvent>,
  68. #[props(default = EventHandler::new(move |_: KeyboardEvent| {}))]
  69. event_handler_w_default_val_explicit: EventHandler<KeyboardEvent>,
  70. }
  71. }
  72. /// This test ensures that read-only signals that contain an option (`Signal<Option<u16>>`)
  73. /// are correctly created as default when not provided.
  74. ///
  75. /// These are compile-time tests.
  76. /// See https://github.com/DioxusLabs/dioxus/issues/2648
  77. #[cfg(test)]
  78. #[allow(unused)]
  79. mod test_optional_signals {
  80. use dioxus::prelude::*;
  81. // Test if test components fail to compile.
  82. #[component]
  83. fn UsesComponents() -> Element {
  84. rsx! {
  85. PropsStruct {
  86. regular_read_signal: ReadOnlySignal::new(Signal::new(1234)),
  87. }
  88. PropsStruct {
  89. optional_read_signal: 1234,
  90. regular_read_signal: 123u16,
  91. }
  92. PropParams {}
  93. PropParams {
  94. opt_read_sig: 1234
  95. }
  96. DoubleOption {}
  97. DoubleOption { optional: Some(1234) }
  98. }
  99. }
  100. // Test props as struct param.
  101. #[derive(Props, Clone, PartialEq)]
  102. struct MyTestProps {
  103. pub optional_read_signal: ReadOnlySignal<Option<u16>>,
  104. pub regular_read_signal: ReadOnlySignal<u16>,
  105. }
  106. #[component]
  107. fn PropsStruct(props: MyTestProps) -> Element {
  108. rsx! { "hi" }
  109. }
  110. // Test props as params.
  111. #[component]
  112. fn PropParams(opt_read_sig: ReadOnlySignal<Option<u16>>) -> Element {
  113. rsx! { "hi!" }
  114. }
  115. #[component]
  116. fn DoubleOption(optional: Option<Option<u16>>) -> Element {
  117. rsx! { "hi!" }
  118. }
  119. }