use regex::Regex;
use std::process::Command;
const BIN: &str = env!("CARGO_BIN_EXE_skill");
#[track_caller]
fn run(args: &[&str]) -> std::process::Output {
Command::new(BIN).args(args).output().expect("spawn skill")
}
#[track_caller]
fn assert_matches(haystack: &str, pattern: &str) {
let re = Regex::new(pattern).expect("valid regex");
assert!(
re.is_match(haystack),
"pattern did not match\n--- pattern ---\n{pattern}\n--- output ---\n{haystack}"
);
}
#[test]
fn no_arguments() {
let out = run(&[]);
assert!(!out.status.success());
let combined = format!(
"{}{}",
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr),
);
assert_matches(
&combined,
r"Usage:\s+skill \[signal\] \[options\] <expression>",
);
}
#[test]
fn list_signal_names() {
let out = run(&["-l"]);
let stdout = String::from_utf8_lossy(&out.stdout);
assert_matches(stdout.trim(), r"^([A-Z0-9+-]+\s*)+$");
}
#[test]
fn list_signal_names_in_table() {
let out = run(&["-L"]);
let stdout = String::from_utf8_lossy(&out.stdout);
assert_matches(&stdout, r"^(\s+\d+ [A-Z0-9+-]+)+\s*$");
}
#[test]
fn find_one_process() {
let pid = std::process::id();
let out = run(&["-n", "-p", &pid.to_string()]);
assert!(out.status.success());
let stdout = String::from_utf8_lossy(&out.stdout);
assert_matches(stdout.trim(), &format!(r"^{pid}\s*$"));
}