use std::process::Command;
fn ev() -> Command {
Command::new(env!("CARGO_BIN_EXE_ev"))
}
fn tmp() -> std::path::PathBuf {
use std::sync::atomic::{AtomicU64, Ordering};
static N: AtomicU64 = AtomicU64::new(0);
let p = std::env::temp_dir().join(format!(
"ev-cli-{}-{}",
std::process::id(),
N.fetch_add(1, Ordering::Relaxed)
));
std::fs::create_dir_all(&p).unwrap();
p
}
#[test]
fn show_should_print_the_tick_and_fail_on_a_missing_id_when_given_an_initialized_store() {
let repo = tmp();
ev().arg("init").current_dir(&repo).output().unwrap();
let id = "aaaaaaaaaaaa";
let tick = r#"{"id":"aaaaaaaaaaaa","parent_id":"","observe":"o","decision":"d","grounds":[],"status":"live","held_since":"","blame":"Wang Yu"}"#;
std::fs::write(repo.join(".evolving/ticks").join(id), tick).unwrap();
let out = ev().args(["show", id]).current_dir(&repo).output().unwrap();
let missing = ev()
.args(["show", "ffffffffffff"])
.current_dir(&repo)
.output()
.unwrap();
assert!(out.status.success());
let s = String::from_utf8_lossy(&out.stdout);
assert!(s.contains("decision") && s.contains("\"d\""));
assert!(!missing.status.success());
}
#[test]
fn init_should_create_the_store_and_stay_idempotent_when_run_twice() {
let repo = tmp();
let out = ev().arg("init").current_dir(&repo).output().unwrap();
let out2 = ev().arg("init").current_dir(&repo).output().unwrap();
assert!(out.status.success());
assert!(repo.join(".evolving/ticks").is_dir());
assert!(out2.status.success());
}
#[test]
fn verify_should_reproduce_the_golden_vectors_when_run_in_self_test_mode() {
let out = ev().args(["verify", "--self-test"]).output().unwrap();
assert!(out.status.success(), "self-test must pass");
let s = String::from_utf8_lossy(&out.stdout);
assert!(s.contains("e2b337f53a1f") && s.contains("638c47b0c9dd"));
}