#![allow(dead_code)]
use std::path::PathBuf;
use std::process::Command;
pub struct IntegrationHelpers;
pub fn scc() -> &'static str {
env!("CARGO_BIN_EXE_scc")
}
pub fn copy_fixture(name: &str) -> tempfile::TempDir {
let src = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.parent()
.unwrap()
.join("fixtures")
.join(name);
let dst = tempfile::TempDir::new().unwrap();
let repo_dir = dst.path().join("repo");
std::fs::create_dir_all(&repo_dir).unwrap();
copy_tree(&src, &repo_dir);
dst
}
pub fn copy_tree(src: &std::path::Path, dst: &std::path::Path) {
for entry in std::fs::read_dir(src).unwrap() {
let entry = entry.unwrap();
let name = entry.file_name();
if name == ".scc" {
continue; }
let from = entry.path();
let to = dst.join(&name);
if from.is_dir() {
std::fs::create_dir_all(&to).unwrap();
copy_tree(&from, &to);
} else {
std::fs::copy(&from, &to).unwrap();
}
}
}
pub fn workdir(tmp: &std::path::Path) -> std::path::PathBuf {
tmp.join("repo")
}
pub fn run(dir: &std::path::Path, args: &[&str]) -> std::process::Output {
Command::new(scc())
.args(args)
.current_dir(dir)
.output()
.expect("scc binary runs")
}
pub fn run_ok(dir: &std::path::Path, args: &[&str]) -> String {
let out = run(dir, args);
assert!(
out.status.success(),
"`scc {}` failed: {}",
args.join(" "),
String::from_utf8_lossy(&out.stderr)
);
String::from_utf8_lossy(&out.stdout).to_string()
}
pub fn is_cfg_condition(c: &str) -> bool {
matches!(
c,
"if" | "else"
| "for"
| "while"
| "try"
| "catch"
| "match"
| "switch"
| "with"
| "do"
| "loop"
| "select"
) || c.starts_with("conditional:")
}