use std::path::PathBuf;
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};
fn ac() -> Command {
Command::new(env!("CARGO_BIN_EXE_ac"))
}
fn temp_ws(tag: &str) -> PathBuf {
let stamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos())
.unwrap_or(0);
let dir = std::env::temp_dir().join(format!("ac-cli-{tag}-{}-{stamp}", std::process::id()));
std::fs::create_dir_all(&dir).expect("建临时工作区");
dir
}
#[test]
fn help_lists_resume_and_last() {
let output = ac().arg("--help").output().expect("跑 --help");
assert!(output.status.success(), "--help 不该失败");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("--resume"), "参数表里要有 --resume");
assert!(stdout.contains("last"), "要说明 last 的语义");
}
#[test]
fn missing_required_flags_exit_2() {
let output = ac().args(["run", "--task", "x"]).output().expect("跑 run");
assert_eq!(output.status.code(), Some(2), "缺参按用法错误退出");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("缺少必需参数"), "stderr: {stderr}");
}
#[test]
fn unknown_flag_exit_2() {
let output = ac()
.args(["run", "--nope"])
.output()
.expect("跑 run --nope");
assert_eq!(output.status.code(), Some(2));
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("未知参数"), "stderr: {stderr}");
}
#[test]
fn resume_last_without_records_exits_2() {
let workspace = temp_ws("resume-none");
let output = ac()
.args([
"run",
"--workspace",
workspace.to_str().expect("utf8 路径"),
"--task",
"续上一次",
"--harness",
"no-such-harness",
"--resume",
"last",
])
.output()
.expect("跑 run --resume last");
assert_eq!(
output.status.code(),
Some(2),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("找不到可续的会话"), "stderr: {stderr}");
}