#![cfg(target_arch = "wasm32")]
use wasm_bindgen::JsValue;
use wasm_bindgen_test::wasm_bindgen_test;
const STASH_KEY: &str = "__ifclite_wasm_panic";
fn read_stash() -> JsValue {
js_sys::Reflect::get(&js_sys::global(), &JsValue::from_str(STASH_KEY))
.expect("global read must not throw")
}
#[wasm_bindgen_test]
fn stash_lands_on_the_js_global_with_location_and_timestamp() {
ifc_lite_wasm::stash_location_parts("geometry/src/mesh_weld.rs", 412, 9);
let stash = read_stash();
let location = js_sys::Reflect::get(&stash, &JsValue::from_str("location"))
.unwrap()
.as_string()
.expect("location must be a string");
assert_eq!(location, "geometry/src/mesh_weld.rs:412:9");
let at = js_sys::Reflect::get(&stash, &JsValue::from_str("at"))
.unwrap()
.as_f64()
.expect("at must be a number");
let now = js_sys::Date::now();
assert!(at <= now && now - at < 60_000.0, "at={at} now={now}");
}
#[wasm_bindgen_test]
fn stash_sanitises_a_build_machine_path_before_it_touches_js() {
ifc_lite_wasm::stash_location_parts("/Users/somebody/scratch/lib.rs", 1, 2);
let stash = read_stash();
let location = js_sys::Reflect::get(&stash, &JsValue::from_str("location"))
.unwrap()
.as_string()
.unwrap();
assert_eq!(location, "scratch/lib.rs:1:2");
}
#[wasm_bindgen_test]
fn a_second_stash_overwrites_the_first() {
ifc_lite_wasm::stash_location_parts("geometry/src/a.rs", 1, 1);
ifc_lite_wasm::stash_location_parts("geometry/src/b.rs", 2, 2);
let stash = read_stash();
let location = js_sys::Reflect::get(&stash, &JsValue::from_str("location"))
.unwrap()
.as_string()
.unwrap();
assert_eq!(location, "geometry/src/b.rs:2:2");
}
#[wasm_bindgen_test]
fn ifc_api_new_does_not_clobber_the_installed_panic_hook() {
ifc_lite_wasm::set_panic_hook();
let installed = std::panic::take_hook();
let before = format!("{:p}", &*installed);
std::panic::set_hook(installed);
let _api = ifc_lite_wasm::IfcAPI::new();
let after_box = std::panic::take_hook();
let after = format!("{:p}", &*after_box);
std::panic::set_hook(after_box);
assert_eq!(
before, after,
"IfcAPI::new() replaced the installed panic hook instead of \
leaving it in place (the #2539 regression: \
console_error_panic_hook::set_once() installs a brand new hook \
behind its own private Once, clobbering whatever set_panic_hook \
had already installed)"
);
}