eval.rs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use dioxus::prelude::*;
  2. use dioxus_desktop::window;
  3. use serde::Deserialize;
  4. #[path = "./utils.rs"]
  5. mod utils;
  6. pub fn main() {
  7. utils::check_app_exits(app);
  8. }
  9. static EVALS_RECEIVED: GlobalSignal<usize> = Signal::global(|| 0);
  10. static EVALS_RETURNED: GlobalSignal<usize> = Signal::global(|| 0);
  11. fn app() -> Element {
  12. // Double 100 values in the value
  13. use_future(|| async {
  14. let mut eval = eval(
  15. r#"for (let i = 0; i < 100; i++) {
  16. let value = await dioxus.recv();
  17. dioxus.send(value*2);
  18. }"#,
  19. );
  20. for i in 0..100 {
  21. eval.send(serde_json::Value::from(i)).unwrap();
  22. let value = eval.recv().await.unwrap();
  23. assert_eq!(value, serde_json::Value::from(i * 2));
  24. EVALS_RECEIVED.with_mut(|x| *x += 1);
  25. }
  26. });
  27. // Make sure returning no value resolves the future
  28. use_future(|| async {
  29. let eval = eval(r#"return;"#);
  30. eval.await.unwrap();
  31. EVALS_RETURNED.with_mut(|x| *x += 1);
  32. });
  33. // Return a value from the future
  34. use_future(|| async {
  35. let eval = eval(
  36. r#"
  37. return [1, 2, 3];
  38. "#,
  39. );
  40. assert_eq!(
  41. Vec::<i32>::deserialize(&eval.await.unwrap()).unwrap(),
  42. vec![1, 2, 3]
  43. );
  44. EVALS_RETURNED.with_mut(|x| *x += 1);
  45. });
  46. use_memo(|| {
  47. println!("expected 100 evals received found {}", EVALS_RECEIVED());
  48. println!("expected 2 eval returned found {}", EVALS_RETURNED());
  49. if EVALS_RECEIVED() == 100 && EVALS_RETURNED() == 2 {
  50. window().close();
  51. }
  52. });
  53. None
  54. }