use std::process::Command;
fn sinter(repo: &std::path::Path, args: &[&str]) -> (bool, String) {
let out = Command::new(env!("CARGO_BIN_EXE_sinter"))
.args(args)
.env("HOME", repo)
.env("USERPROFILE", repo)
.current_dir(repo)
.output()
.expect("run sinter");
(
out.status.success(),
format!(
"{}{}",
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr)
),
)
}
fn fixture() -> tempfile::TempDir {
let dir = tempfile::tempdir().unwrap();
let repo = dir.path();
std::fs::create_dir_all(repo.join("src")).unwrap();
std::fs::write(
repo.join("src/main.rs"),
"fn orphan_wipe() {}\nfn main() {}\n",
)
.unwrap();
let (ok, out) = sinter(repo, &["build"]);
assert!(ok, "{out}");
dir
}
#[test]
fn an_empty_affected_names_the_command_that_settles_it() {
let dir = fixture();
let repo = dir.path();
let (found, out) = sinter(repo, &["affected", "orphan_wipe"]);
assert!(!found, "{out}");
assert!(out.contains("not proven: 0 dependents"), "{out}");
assert!(
out.contains("verify: sinter unresolved --name orphan_wipe"),
"{out}"
);
let (_, out) = sinter(repo, &["affected", "orphan_wipe", "--json"]);
let value: serde_json::Value = serde_json::from_str(out.lines().next().unwrap()).unwrap();
assert_eq!(value["status"], "not_proven");
assert_eq!(value["verify_with"], "sinter unresolved --name orphan_wipe");
assert_eq!(value["coverage"]["status"], "not_proven");
assert_eq!(value["coverage"]["conclusive"], false);
}
#[test]
fn an_empty_deps_names_the_command_that_settles_it() {
let dir = fixture();
let repo = dir.path();
let (found, out) = sinter(repo, &["deps", "orphan_wipe"]);
assert!(!found, "{out}");
assert!(out.contains("not proven: 0 dependencies"), "{out}");
assert!(
out.contains("verify: sinter unresolved --name orphan_wipe"),
"{out}"
);
let (_, out) = sinter(repo, &["deps", "orphan_wipe", "--json"]);
let value: serde_json::Value = serde_json::from_str(out.lines().next().unwrap()).unwrap();
assert_eq!(value["status"], "not_proven");
assert_eq!(value["verify_with"], "sinter unresolved --name orphan_wipe");
assert_eq!(value["coverage"]["conclusive"], false);
}
#[test]
fn grep_over_an_empty_bound_still_reports_coverage() {
let dir = fixture();
let repo = dir.path();
let (found, out) = sinter(
repo,
&["grep", "orphan_wipe", "--within", "affected(orphan_wipe)"],
);
assert!(!found, "{out}");
assert!(out.contains("bound 0 files"), "{out}");
assert!(out.contains("coverage:"), "{out}");
let (_, out) = sinter(
repo,
&[
"grep",
"orphan_wipe",
"--within",
"affected(orphan_wipe)",
"--json",
],
);
let value: serde_json::Value = serde_json::from_str(out.lines().next().unwrap()).unwrap();
assert_eq!(value["status"], "not_proven");
assert_eq!(value["files_in_bound"], 0);
assert_eq!(value["coverage"]["status"], "not_proven");
assert_eq!(value["coverage"]["conclusive"], false);
let (found, out) = sinter(
repo,
&[
"grep",
"orphan_wipe",
"--within",
"file(src/main.rs)",
"--json",
],
);
assert!(found, "{out}");
let value: serde_json::Value = serde_json::from_str(out.lines().next().unwrap()).unwrap();
assert_eq!(value["status"], "found");
assert!(value.get("coverage").is_none(), "{value}");
}