#[macro_export]
macro_rules! browser_test {
($name:ident => $path:expr) => {
#[test]
fn $name() {
let path = ::std::concat!(::std::env!("CARGO_MANIFEST_DIR"), "/", $path);
let toml_content = match ::std::fs::read_to_string(path) {
Ok(c) => c,
Err(e) => {
::std::eprintln!(
"⏭️ skipping {}: cannot read TOML ({e})",
::std::stringify!($name)
);
return;
}
};
let scenario: $crate::scenario::Scenario = match ::toml::from_str(&toml_content) {
Ok(s) => s,
Err(e) => {
::std::eprintln!(
"⏭️ skipping {}: invalid TOML ({e})",
::std::stringify!($name)
);
return;
}
};
let config = scenario.config.clone();
let definitions = scenario.definitions;
let runner = $crate::runner::ScenarioRunner::new(config, definitions);
match runner.run(&scenario.test) {
Ok(report) => {
if report.tests_passed == 0
&& report.failed > 0
&& report.details.iter().any(|d| {
d.message.contains("LLM assertion call failed")
|| d.message.contains("LLM element targeting failed")
})
{
::std::eprintln!(
"⏭️ skipping {}: LLM endpoint unavailable",
::std::stringify!($name)
);
return;
}
assert_eq!(
report.tests_failed,
0,
"{}: {} test(s) failed, {} passed",
::std::stringify!($name),
report.tests_failed,
report.tests_passed,
);
assert_ne!(
report.tests_passed,
0,
"{}: no tests ran",
::std::stringify!($name)
);
}
Err(e) => {
if e.to_string().contains("failed to launch browser") {
::std::eprintln!(
"⏭️ skipping {}: browser unavailable ({e})",
::std::stringify!($name)
);
return;
}
panic!("{}: scenario run failed: {e}", ::std::stringify!($name));
}
}
}
};
}
#[macro_export]
macro_rules! browser_test_inline {
($name:ident, $toml:expr) => {
#[test]
fn $name() {
let scenario: $crate::scenario::Scenario = match ::toml::from_str($toml) {
Ok(s) => s,
Err(e) => {
::std::eprintln!(
"⏭️ skipping {}: invalid TOML ({e})",
::std::stringify!($name)
);
return;
}
};
let config = scenario.config.clone();
let definitions = scenario.definitions;
let runner = $crate::runner::ScenarioRunner::new(config, definitions);
match runner.run(&scenario.test) {
Ok(report) => {
if report.tests_passed == 0
&& report.failed > 0
&& report.details.iter().any(|d| {
d.message.contains("LLM assertion call failed")
|| d.message.contains("LLM element targeting failed")
})
{
::std::eprintln!(
"⏭️ skipping {}: LLM endpoint unavailable",
::std::stringify!($name)
);
return;
}
assert_eq!(
report.tests_failed,
0,
"{}: {} test(s) failed, {} passed",
::std::stringify!($name),
report.tests_failed,
report.tests_passed,
);
assert_ne!(
report.tests_passed,
0,
"{}: no tests ran",
::std::stringify!($name)
);
}
Err(e) => {
if e.to_string().contains("failed to launch browser") {
::std::eprintln!(
"⏭️ skipping {}: browser unavailable ({e})",
::std::stringify!($name)
);
return;
}
panic!("{}: scenario run failed: {e}", ::std::stringify!($name));
}
}
}
};
}