miri_simple.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. use dioxus::prelude::*;
  2. #[test]
  3. fn app_drops() {
  4. fn app() -> Element {
  5. rsx! { div {} }
  6. }
  7. let mut dom = VirtualDom::new(app);
  8. dom.rebuild(&mut dioxus_core::NoOpMutations);
  9. dom.mark_dirty(ScopeId::ROOT);
  10. _ = dom.render_immediate_to_vec();
  11. }
  12. #[test]
  13. fn hooks_drop() {
  14. fn app() -> Element {
  15. use_hook(|| String::from("asd"));
  16. use_hook(|| String::from("asd"));
  17. use_hook(|| String::from("asd"));
  18. use_hook(|| String::from("asd"));
  19. rsx! { div {} }
  20. }
  21. let mut dom = VirtualDom::new(app);
  22. dom.rebuild(&mut dioxus_core::NoOpMutations);
  23. dom.mark_dirty(ScopeId::ROOT);
  24. _ = dom.render_immediate_to_vec();
  25. }
  26. #[test]
  27. fn contexts_drop() {
  28. fn app() -> Element {
  29. provide_context(String::from("asd"));
  30. rsx! {
  31. div { ChildComp {} }
  32. }
  33. }
  34. #[allow(non_snake_case)]
  35. fn ChildComp() -> Element {
  36. let el = consume_context::<String>();
  37. rsx! { div { "hello {el}" } }
  38. }
  39. let mut dom = VirtualDom::new(app);
  40. dom.rebuild(&mut dioxus_core::NoOpMutations);
  41. dom.mark_dirty(ScopeId::ROOT);
  42. _ = dom.render_immediate_to_vec();
  43. }
  44. #[test]
  45. fn tasks_drop() {
  46. fn app() -> Element {
  47. spawn(async {
  48. // tokio::time::sleep(std::time::Duration::from_millis(100000)).await;
  49. });
  50. rsx! { div {} }
  51. }
  52. let mut dom = VirtualDom::new(app);
  53. dom.rebuild(&mut dioxus_core::NoOpMutations);
  54. dom.mark_dirty(ScopeId::ROOT);
  55. _ = dom.render_immediate_to_vec();
  56. }
  57. #[test]
  58. fn root_props_drop() {
  59. #[derive(Clone)]
  60. struct RootProps(String);
  61. let mut dom = VirtualDom::new_with_props(
  62. |cx: RootProps| rsx!( div { "{cx.0}" } ),
  63. RootProps("asdasd".to_string()),
  64. );
  65. dom.rebuild(&mut dioxus_core::NoOpMutations);
  66. dom.mark_dirty(ScopeId::ROOT);
  67. _ = dom.render_immediate_to_vec();
  68. }
  69. #[test]
  70. fn diffing_drops_old() {
  71. fn app() -> Element {
  72. rsx! {
  73. div {
  74. match generation() % 2 {
  75. 0 => rsx!( ChildComp1 { name: "asdasd".to_string() }),
  76. 1 => rsx!( ChildComp2 { name: "asdasd".to_string() }),
  77. _ => unreachable!()
  78. }
  79. }
  80. }
  81. }
  82. #[component]
  83. fn ChildComp1(name: String) -> Element {
  84. rsx! {"Hello {name}"}
  85. }
  86. #[component]
  87. fn ChildComp2(name: String) -> Element {
  88. rsx! {"Goodbye {name}"}
  89. }
  90. let mut dom = VirtualDom::new(app);
  91. dom.rebuild(&mut dioxus_core::NoOpMutations);
  92. dom.mark_dirty(ScopeId::ROOT);
  93. _ = dom.render_immediate_to_vec();
  94. }
  95. #[test]
  96. fn hooks_drop_before_contexts() {
  97. fn app() -> Element {
  98. provide_context(123i32);
  99. use_hook(|| {
  100. #[derive(Clone)]
  101. struct ReadsContextOnDrop;
  102. impl Drop for ReadsContextOnDrop {
  103. fn drop(&mut self) {
  104. assert_eq!(123, consume_context::<i32>());
  105. }
  106. }
  107. ReadsContextOnDrop
  108. });
  109. rsx! { div {} }
  110. }
  111. let mut dom = VirtualDom::new(app);
  112. dom.rebuild(&mut dioxus_core::NoOpMutations);
  113. dom.mark_dirty(ScopeId::ROOT);
  114. _ = dom.render_immediate_to_vec();
  115. }