use amberfork_model::DiffResult;
use assert_cmd::Command;
use std::path::{Path, PathBuf};
const EXIT_FORKED: i32 = 1;
fn assets_dir() -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/demo")
}
fn amberfork_demo() -> Command {
let mut cmd = Command::cargo_bin("amberfork").expect("amberfork binary builds");
cmd.current_dir(std::env::temp_dir()).arg("demo");
cmd
}
fn gold_step() -> usize {
let manifest: serde_json::Value = serde_json::from_str(
&std::fs::read_to_string(assets_dir().join("pair_demo.json")).unwrap(),
)
.unwrap();
manifest["gold_step"].as_u64().expect("gold_step") as usize
}
#[test]
fn demo_runs_without_files_and_json_locates_the_authored_fork() {
let assert = amberfork_demo().arg("--json").assert().code(EXIT_FORKED);
let output = assert.get_output();
let stdout = String::from_utf8(output.stdout.clone()).unwrap();
let result: DiffResult =
serde_json::from_str(&stdout).expect("--json stdout must be a valid DiffResult");
let fork = result
.fork
.expect("the bundled pair encodes a real divergence");
assert_eq!(
fork.b_step,
Some(gold_step()),
"fork must land on observed-run step {} (demo manifest gold)",
gold_step()
);
assert!(
result.warnings.is_empty(),
"the bundled pair must ingest warning-free, got: {:?}",
result.warnings
);
}
#[test]
fn demo_render_hands_off_to_real_usage_with_clean_stderr() {
let assert = amberfork_demo()
.arg("--no-color")
.assert()
.code(EXIT_FORKED);
let output = assert.get_output();
let stdout = String::from_utf8(output.stdout.clone()).unwrap();
assert!(
stdout.contains("amberfork diff <bad> --against <good>"),
"the demo's last job is teaching the real command, got:\n{stdout}"
);
assert!(
output.stderr.is_empty(),
"a demo that prints warnings looks broken: {}",
String::from_utf8_lossy(&output.stderr)
);
}
#[test]
fn demo_render_matches_snapshot() {
let assert = amberfork_demo()
.arg("--no-color")
.assert()
.code(EXIT_FORKED);
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
insta::assert_snapshot!("demo_no_color", stdout);
}