create.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #![allow(unused, non_upper_case_globals, non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_core::ElementId;
  4. use dioxus_core::NoOpMutations;
  5. use dioxus_signals::*;
  6. #[test]
  7. fn create_signals_global() {
  8. let mut dom = VirtualDom::new(|| {
  9. rsx! {
  10. for _ in 0..10 {
  11. Child {}
  12. }
  13. }
  14. });
  15. fn Child() -> Element {
  16. let signal = create_without_cx();
  17. rsx! {
  18. "{signal}"
  19. }
  20. }
  21. dom.rebuild_in_place();
  22. fn create_without_cx() -> Signal<String> {
  23. Signal::new("hello world".to_string())
  24. }
  25. }
  26. #[test]
  27. fn deref_signal() {
  28. let mut dom = VirtualDom::new(|| {
  29. rsx! {
  30. for _ in 0..10 {
  31. Child {}
  32. }
  33. }
  34. });
  35. fn Child() -> Element {
  36. let signal = Signal::new("hello world".to_string());
  37. // You can call signals like functions to get a Ref of their value.
  38. assert_eq!(&*signal(), "hello world");
  39. rsx! {
  40. "hello world"
  41. }
  42. }
  43. dom.rebuild_in_place();
  44. }
  45. #[test]
  46. fn drop_signals() {
  47. use std::sync::atomic::AtomicUsize;
  48. use std::sync::atomic::Ordering;
  49. static SIGNAL_DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
  50. let mut dom = VirtualDom::new(|| {
  51. let generation = generation();
  52. let count = if generation % 2 == 0 { 10 } else { 0 };
  53. rsx! {
  54. for _ in 0..count {
  55. Child {}
  56. }
  57. }
  58. });
  59. fn Child() -> Element {
  60. struct TracksDrops;
  61. impl Drop for TracksDrops {
  62. fn drop(&mut self) {
  63. SIGNAL_DROP_COUNT.fetch_add(1, Ordering::Relaxed);
  64. }
  65. }
  66. use_signal(|| TracksDrops);
  67. rsx! {
  68. ""
  69. }
  70. }
  71. dom.rebuild_in_place();
  72. dom.mark_dirty(ScopeId::ROOT);
  73. dom.render_immediate(&mut NoOpMutations);
  74. assert_eq!(SIGNAL_DROP_COUNT.load(Ordering::Relaxed), 10);
  75. }