use oxc_coverage_instrument::{InstrumentOptions, instrument};
fn names(source: &str, name_callbacks: bool) -> Vec<String> {
let options =
InstrumentOptions { name_callback_arguments: name_callbacks, ..Default::default() };
let result = instrument(source, "t.js", &options).unwrap();
result.coverage_map.fn_map.values().map(|entry| entry.name.clone()).collect()
}
#[test]
fn default_leaves_callback_arguments_anonymous() {
let got = names("arr.map((x) => x + 1);", false);
assert_eq!(got.len(), 1);
assert!(
got[0].starts_with("(anonymous_"),
"default output must stay anonymous, got {}",
got[0]
);
}
#[test]
fn member_callee_names_the_callback() {
assert_eq!(names("arr.map((x) => x + 1);", true), vec!["map"]);
}
#[test]
fn plain_identifier_callee_names_the_callback() {
assert_eq!(names("useMemo(() => compute());", true), vec!["useMemo"]);
}
#[test]
fn function_expression_argument_is_named_too() {
assert_eq!(names("run(function () { return 1; });", true), vec!["run"]);
}
#[test]
fn new_expression_callee_names_the_callback() {
assert_eq!(names("new Promise((resolve) => resolve(1));", true), vec!["Promise"]);
}
#[test]
fn later_argument_after_a_string_literal_is_named_from_callee() {
assert_eq!(
names("el.addEventListener(\"click\", () => handle());", true),
vec!["addEventListener"]
);
}
#[test]
fn computed_string_key_callee_is_named() {
assert_eq!(names("obj[\"handler\"](() => run());", true), vec!["handler"]);
}
#[test]
fn binding_name_is_unaffected_by_the_flag() {
assert_eq!(names("const handler = () => run();", true), vec!["handler"]);
}
#[test]
fn named_function_expression_keeps_its_own_id() {
assert_eq!(names("run(function inner() { return 1; });", true), vec!["inner"]);
}
#[test]
fn iife_callee_stays_anonymous() {
let got = names("(function () { return 1; })();", true);
assert_eq!(got.len(), 1);
assert!(got[0].starts_with("(anonymous_"), "IIFE must stay anonymous, got {}", got[0]);
}
#[test]
fn computed_non_string_callee_stays_anonymous() {
let got = names("handlers[index](() => run());", true);
assert_eq!(got.len(), 1);
assert!(
got[0].starts_with("(anonymous_"),
"computed non-string callee must stay anonymous, got {}",
got[0]
);
}
#[test]
fn nested_callbacks_each_take_their_own_callee() {
let mut got = names("outer(() => inner(() => 1));", true);
got.sort();
assert_eq!(got, vec!["inner", "outer"]);
}
#[test]
fn repeated_callee_names_are_stable_and_repeat() {
let got = names("a.map((x) => x);\nb.map((y) => y);", true);
assert_eq!(got, vec!["map", "map"]);
}