#![allow(dead_code)]
use std::path::{Path, PathBuf};
use std::process::{Command, Output};
use std::sync::atomic::{AtomicUsize, Ordering};
pub fn fixture(name: &str) -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR"))
.join("tests/fixtures")
.join(name)
}
pub fn pinoc(dir: &Path, args: &[&str]) -> Output {
Command::new(env!("CARGO_BIN_EXE_pinoc"))
.args(args)
.current_dir(dir)
.output()
.expect("failed to run pinoc")
}
pub fn stdout(out: &Output) -> String {
String::from_utf8_lossy(&out.stdout).into_owned()
}
pub fn stderr(out: &Output) -> String {
String::from_utf8_lossy(&out.stderr).into_owned()
}
pub fn temp_copy(name: &str) -> PathBuf {
static NEXT: AtomicUsize = AtomicUsize::new(0);
let dir = std::env::temp_dir().join(format!(
"pinoc-test-{}-{}-{name}",
std::process::id(),
NEXT.fetch_add(1, Ordering::SeqCst)
));
let _ = std::fs::remove_dir_all(&dir);
copy_dir(&fixture(name), &dir);
dir
}
fn copy_dir(from: &Path, to: &Path) {
std::fs::create_dir_all(to).unwrap();
for entry in std::fs::read_dir(from).unwrap() {
let entry = entry.unwrap();
let dest = to.join(entry.file_name());
if entry.path().is_dir() {
copy_dir(&entry.path(), &dest);
} else {
std::fs::copy(entry.path(), dest).unwrap();
}
}
}
pub fn read_json(path: &Path) -> serde_json::Value {
serde_json::from_str(&std::fs::read_to_string(path).unwrap()).unwrap()
}