use std::process::Command;
fn warble() -> Command {
Command::new(env!("CARGO_BIN_EXE_warble"))
}
fn driftwood_golden() -> String {
format!(
"{}/../eval/golden/driftwood/cases.yaml",
env!("CARGO_MANIFEST_DIR")
)
}
#[test]
fn invalid_sample_value_fails_fast_with_guidance() {
let out = warble()
.args([
"eval",
"run",
"--project",
"/nonexistent",
"--agent-dir",
"/nonexistent",
"--golden",
"/nonexistent.yaml",
"--sample",
"not-a-number",
])
.output()
.expect("run warble");
assert!(!out.status.success(), "invalid --sample must exit non-zero");
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("--sample"),
"error should name the offending flag, got: {stderr}"
);
}
#[test]
fn tags_matching_no_case_errors_before_running_claude() {
let out = warble()
.args([
"eval",
"run",
"--project",
"/nonexistent",
"--agent-dir",
"/nonexistent",
"--golden",
&driftwood_golden(),
"--tags",
"__no_such_tag__",
])
.output()
.expect("run warble");
assert!(
!out.status.success(),
"an empty tag selection must exit non-zero"
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("no golden cases match"),
"error should explain the empty selection, got: {stderr}"
);
}
#[test]
fn unsupported_backend_fails_fast_naming_the_supported_set() {
let out = warble()
.args([
"eval",
"run",
"--project",
"/nonexistent",
"--agent-dir",
"/nonexistent",
"--golden",
&driftwood_golden(),
"--backend",
"vercel",
])
.output()
.expect("run warble");
assert!(
!out.status.success(),
"an adapter-less --backend must exit non-zero"
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("vercel") && stderr.contains("no eval runner adapter"),
"error should name the requested backend and explain why, got: {stderr}"
);
assert!(
stderr.contains("claude-code-cli") && stderr.contains("claude-agent-sdk"),
"error should name the supported backends, got: {stderr}"
);
}
#[test]
fn per_tag_sample_is_accepted_and_selects_a_subset() {
let out = warble()
.args([
"eval",
"run",
"--project",
"/nonexistent",
"--agent-dir",
"/nonexistent",
"--golden",
&driftwood_golden(),
"--sample",
"per-tag:1",
])
.output()
.expect("run warble");
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("golden selection:") && stderr.contains("per-tag:1"),
"expected the selection note on stderr, got: {stderr}"
);
assert!(
stderr.contains("/53"),
"note should show the subset out of the 53-case total, got: {stderr}"
);
}