2018-08-09 16:21:12 -07:00
|
|
|
#![cfg(target_arch = "wasm32")]
|
|
|
|
|
2019-06-10 21:10:06 +03:00
|
|
|
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
|
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
use futures_channel::oneshot;
|
2018-08-09 16:21:12 -07:00
|
|
|
use wasm_bindgen::prelude::*;
|
2019-01-05 14:34:50 +00:00
|
|
|
use wasm_bindgen_futures::{future_to_promise, spawn_local, JsFuture};
|
2018-08-09 16:21:12 -07:00
|
|
|
use wasm_bindgen_test::*;
|
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn promise_resolve_is_ok_future() {
|
2018-08-09 16:21:12 -07:00
|
|
|
let p = js_sys::Promise::resolve(&JsValue::from(42));
|
2019-09-05 11:18:36 -05:00
|
|
|
let x = JsFuture::from(p).await.unwrap();
|
|
|
|
assert_eq!(x, 42);
|
2018-08-09 16:21:12 -07:00
|
|
|
}
|
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn promise_reject_is_error_future() {
|
2018-08-09 16:21:12 -07:00
|
|
|
let p = js_sys::Promise::reject(&JsValue::from(42));
|
2019-09-05 11:18:36 -05:00
|
|
|
let e = JsFuture::from(p).await.unwrap_err();
|
|
|
|
assert_eq!(e, 42);
|
2018-08-09 16:21:12 -07:00
|
|
|
}
|
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn ok_future_is_resolved_promise() {
|
|
|
|
let p = future_to_promise(async { Ok(JsValue::from(42)) });
|
|
|
|
let x = JsFuture::from(p).await.unwrap();
|
|
|
|
assert_eq!(x, 42);
|
2018-08-09 16:21:12 -07:00
|
|
|
}
|
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn error_future_is_rejected_promise() {
|
|
|
|
let p = future_to_promise(async { Err(JsValue::from(42)) });
|
|
|
|
let e = JsFuture::from(p).await.unwrap_err();
|
|
|
|
assert_eq!(e, 42);
|
2018-08-09 16:21:12 -07:00
|
|
|
}
|
2018-10-10 12:41:26 -07:00
|
|
|
|
2019-04-20 09:29:03 +03:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
fn debug_jsfuture() {
|
|
|
|
let p = js_sys::Promise::resolve(&JsValue::from(42));
|
|
|
|
let f = JsFuture::from(p);
|
|
|
|
assert_eq!(&format!("{:?}", f), "JsFuture { ... }");
|
|
|
|
}
|
|
|
|
|
2018-10-10 12:41:26 -07:00
|
|
|
#[wasm_bindgen]
|
2018-11-27 12:07:59 -08:00
|
|
|
extern "C" {
|
2019-09-05 11:18:36 -05:00
|
|
|
fn setTimeout(c: &Closure<dyn FnMut()>);
|
2018-10-10 12:41:26 -07:00
|
|
|
}
|
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn oneshot_works() {
|
2018-10-10 12:41:26 -07:00
|
|
|
let (tx, rx) = oneshot::channel::<u32>();
|
|
|
|
let mut tx = Some(tx);
|
|
|
|
let closure = Closure::wrap(Box::new(move || {
|
|
|
|
drop(tx.take().unwrap());
|
2019-09-05 11:18:36 -05:00
|
|
|
}) as Box<dyn FnMut()>);
|
2018-10-10 12:41:26 -07:00
|
|
|
setTimeout(&closure);
|
|
|
|
closure.forget();
|
2019-09-05 11:18:36 -05:00
|
|
|
rx.await.unwrap_err();
|
2018-10-10 12:41:26 -07:00
|
|
|
}
|
2019-01-05 14:34:50 +00:00
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn spawn_local_runs() {
|
2019-01-05 14:34:50 +00:00
|
|
|
let (tx, rx) = oneshot::channel::<u32>();
|
2019-09-05 11:18:36 -05:00
|
|
|
spawn_local(async {
|
2019-05-28 07:05:52 -07:00
|
|
|
tx.send(42).unwrap();
|
2019-09-05 11:18:36 -05:00
|
|
|
});
|
|
|
|
assert_eq!(rx.await.unwrap(), 42);
|
2019-01-05 14:34:50 +00:00
|
|
|
}
|
2019-01-14 21:04:29 +01:00
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn spawn_local_err_no_exception() {
|
2019-01-14 21:04:29 +01:00
|
|
|
let (tx, rx) = oneshot::channel::<u32>();
|
2019-09-05 11:18:36 -05:00
|
|
|
spawn_local(async { });
|
|
|
|
spawn_local(async {
|
2019-05-28 07:05:52 -07:00
|
|
|
tx.send(42).unwrap();
|
2019-09-05 11:18:36 -05:00
|
|
|
});
|
|
|
|
let val = rx.await.unwrap();
|
|
|
|
assert_eq!(val, 42);
|
2019-01-14 21:04:29 +01:00
|
|
|
}
|
|
|
|
|
2019-09-05 11:18:36 -05:00
|
|
|
#[wasm_bindgen_test]
|
|
|
|
async fn can_create_multiple_futures_from_same_promise() {
|
2019-02-04 16:38:21 +01:00
|
|
|
let promise = js_sys::Promise::resolve(&JsValue::null());
|
|
|
|
let a = JsFuture::from(promise.clone());
|
|
|
|
let b = JsFuture::from(promise);
|
2019-09-05 11:18:36 -05:00
|
|
|
|
|
|
|
a.await.unwrap();
|
|
|
|
b.await.unwrap();
|
2019-02-04 16:38:21 +01:00
|
|
|
}
|