lifecycle.rs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #![allow(unused, non_upper_case_globals)]
  2. #![allow(non_snake_case)]
  3. //! Tests for the lifecycle of components.
  4. use dioxus::dioxus_core::{ElementId, Mutation::*};
  5. use dioxus::html::SerializedHtmlEventConverter;
  6. use dioxus::prelude::*;
  7. use std::rc::Rc;
  8. use std::sync::{Arc, Mutex};
  9. type Shared<T> = Arc<Mutex<T>>;
  10. #[test]
  11. fn manual_diffing() {
  12. #[derive(Clone)]
  13. struct AppProps {
  14. value: Shared<&'static str>,
  15. }
  16. fn app(cx: AppProps) -> Element {
  17. let val = cx.value.lock().unwrap();
  18. rsx! { div { "{val}" } }
  19. };
  20. let value = Arc::new(Mutex::new("Hello"));
  21. let mut dom = VirtualDom::new_with_props(app, AppProps { value: value.clone() });
  22. dom.rebuild(&mut dioxus_core::NoOpMutations);
  23. *value.lock().unwrap() = "goodbye";
  24. assert_eq!(
  25. dom.rebuild_to_vec().santize().edits,
  26. [
  27. LoadTemplate { name: "template", index: 0, id: ElementId(3) },
  28. HydrateText { path: &[0], value: "goodbye".to_string(), id: ElementId(4) },
  29. AppendChildren { m: 1, id: ElementId(0) }
  30. ]
  31. );
  32. }
  33. #[test]
  34. fn events_generate() {
  35. set_event_converter(Box::new(SerializedHtmlEventConverter));
  36. fn app() -> Element {
  37. let mut count = use_signal(|| 0);
  38. match count() {
  39. 0 => rsx! {
  40. div { onclick: move |_| count += 1,
  41. div { "nested" }
  42. "Click me!"
  43. }
  44. },
  45. _ => None,
  46. }
  47. };
  48. let mut dom = VirtualDom::new(app);
  49. dom.rebuild(&mut dioxus_core::NoOpMutations);
  50. dom.handle_event(
  51. "click",
  52. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
  53. ElementId(1),
  54. true,
  55. );
  56. dom.mark_dirty(ScopeId::ROOT);
  57. let edits = dom.render_immediate_to_vec();
  58. assert_eq!(
  59. edits.edits,
  60. [
  61. CreatePlaceholder { id: ElementId(2) },
  62. ReplaceWith { id: ElementId(1), m: 1 }
  63. ]
  64. )
  65. }