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::any::Any;
  8. use std::rc::Rc;
  9. use std::sync::{Arc, Mutex};
  10. type Shared<T> = Arc<Mutex<T>>;
  11. #[test]
  12. fn manual_diffing() {
  13. #[derive(Clone)]
  14. struct AppProps {
  15. value: Shared<&'static str>,
  16. }
  17. fn app(cx: AppProps) -> Element {
  18. let val = cx.value.lock().unwrap();
  19. rsx! { div { "{val}" } }
  20. };
  21. let value = Arc::new(Mutex::new("Hello"));
  22. let mut dom = VirtualDom::new_with_props(app, AppProps { value: value.clone() });
  23. dom.rebuild(&mut dioxus_core::NoOpMutations);
  24. *value.lock().unwrap() = "goodbye";
  25. assert_eq!(
  26. dom.rebuild_to_vec().edits,
  27. [
  28. LoadTemplate { index: 0, id: ElementId(3) },
  29. CreateTextNode { value: "goodbye".to_string(), id: ElementId(4) },
  30. ReplacePlaceholder { path: &[0], m: 1 },
  31. AppendChildren { m: 1, id: ElementId(0) }
  32. ]
  33. );
  34. }
  35. #[test]
  36. fn events_generate() {
  37. set_event_converter(Box::new(SerializedHtmlEventConverter));
  38. fn app() -> Element {
  39. let mut count = use_signal(|| 0);
  40. match count() {
  41. 0 => rsx! {
  42. div { onclick: move |_| count += 1,
  43. div { "nested" }
  44. "Click me!"
  45. }
  46. },
  47. _ => VNode::empty(),
  48. }
  49. };
  50. let mut dom = VirtualDom::new(app);
  51. dom.rebuild(&mut dioxus_core::NoOpMutations);
  52. let event = Event::new(
  53. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())) as Rc<dyn Any>,
  54. true,
  55. );
  56. dom.runtime().handle_event("click", event, ElementId(1));
  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. }