1
0

lifecycle.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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().edits,
  26. [
  27. LoadTemplate { index: 0, id: ElementId(3) },
  28. CreateTextNode { value: "goodbye".to_string(), id: ElementId(4) },
  29. ReplacePlaceholder { path: &[0], m: 1 },
  30. AppendChildren { m: 1, id: ElementId(0) }
  31. ]
  32. );
  33. }
  34. #[test]
  35. fn events_generate() {
  36. set_event_converter(Box::new(SerializedHtmlEventConverter));
  37. fn app() -> Element {
  38. let mut count = use_signal(|| 0);
  39. match count() {
  40. 0 => rsx! {
  41. div { onclick: move |_| count += 1,
  42. div { "nested" }
  43. "Click me!"
  44. }
  45. },
  46. _ => VNode::empty(),
  47. }
  48. };
  49. let mut dom = VirtualDom::new(app);
  50. dom.rebuild(&mut dioxus_core::NoOpMutations);
  51. dom.handle_event(
  52. "click",
  53. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
  54. ElementId(1),
  55. true,
  56. );
  57. dom.mark_dirty(ScopeId::APP);
  58. let edits = dom.render_immediate_to_vec();
  59. assert_eq!(
  60. edits.edits,
  61. [
  62. CreatePlaceholder { id: ElementId(2) },
  63. ReplaceWith { id: ElementId(1), m: 1 }
  64. ]
  65. )
  66. }