use async_trait::async_trait; use jsandbox::serde_json; use jsandbox::AnyError; #[tokio::test] async fn call() { let mut script = jsandbox::Script::from_string("function add(a, b) { return a + b; }") .build() .unwrap(); let result: u32 = script.call("add", (1, 2)).await.unwrap(); assert_eq!(result, 3); } #[tokio::test] async fn call_async() { let mut script = jsandbox::Script::from_string( "async function add(a, b) { return new Promise((resolve) => resolve(a + b)); }", ) .build() .unwrap(); let result: u32 = script.call("add", (1, 2)).await.unwrap(); assert_eq!(result, 3); } #[tokio::test] async fn call_timeout() { let mut script = jsandbox::Script::from_string("function timeout() { for(;;){} }") .build() .unwrap() .timeout(std::time::Duration::from_millis(100)); let result: Result = script.call("timeout", ()).await; let err = result.unwrap_err(); assert_eq!(err.to_string(), "Uncaught Error: execution terminated"); } #[tokio::test] async fn forgot_build() { let mut script = jsandbox::Script::from_string("function func() { }"); let result: Result = script.call("func", ()).await; let err = result.unwrap_err(); assert!(err .to_string() .contains("Script is not properly initialized")); } #[tokio::test] async fn var_state() { let mut script = jsandbox::Script::from_string( " let val = 1; function get_val() { return val++; } ", ) .build() .unwrap(); let mut result: u32 = script.call("get_val", ()).await.unwrap(); assert_eq!(result, 1); result = script.call("get_val", ()).await.unwrap(); assert_eq!(result, 2); } struct MyCallback { value: i32, } #[async_trait] impl jsandbox::Callback for MyCallback { async fn callback(&mut self, value: serde_json::Value) -> Result { assert_eq!(self.value, value); Ok(jsandbox::serde_json::to_value(789)?) } } #[tokio::test] async fn func_callback() { let mut script = jsandbox::Script::from_string( " async function call_my_callback() { return await my_callback(123); } ", ) .function("my_callback".to_string(), MyCallback { value: 123_i32 }) .build() .unwrap(); let result: u32 = script.call("call_my_callback", ()).await.unwrap(); assert_eq!(result, 789); }