use std::process::Command; use tempfile::TempDir; fn arc_cmd() -> Command { let mut cmd = Command::new(env!("CARGO_BIN_EXE_arc")); cmd.env("NO_COLOR", "1"); cmd } fn init_repo() -> TempDir { let dir = TempDir::new().unwrap(); arc_cmd() .arg("init") .current_dir(dir.path()) .output() .expect("failed to init"); dir } fn commit_id(dir: &TempDir, msg: &str) -> String { let output = arc_cmd() .args(["commit", msg]) .current_dir(dir.path()) .output() .expect("failed to commit"); assert!(output.status.success()); String::from_utf8_lossy(&output.stdout) .trim() .strip_prefix("✓ committed ") .unwrap() .to_string() } #[test] fn show_commit_by_full_id() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "hello\n").unwrap(); let id = commit_id(&dir, "test show"); let output = arc_cmd() .args(["show", &id]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains(&id)); assert!(stdout.contains("test show")); } #[test] fn show_commit_by_prefix() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "hello\n").unwrap(); let id = commit_id(&dir, "prefix test"); let short = &id[..12]; let output = arc_cmd() .args(["show", short]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains(&id)); assert!(stdout.contains("prefix test")); } #[test] fn show_by_bookmark() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "hello\n").unwrap(); let id = commit_id(&dir, "bookmark show"); let output = arc_cmd() .args(["show", "main"]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains(&id)); assert!(stdout.contains("bookmark show")); } #[test] fn show_head() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "hello\n").unwrap(); let id = commit_id(&dir, "head show"); let output = arc_cmd() .args(["show", "HEAD"]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains(&id)); assert!(stdout.contains("head show")); } #[test] fn show_displays_diff() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "hello\n").unwrap(); commit_id(&dir, "first"); std::fs::write(dir.path().join("a.txt"), "world\n").unwrap(); let id = commit_id(&dir, "modify"); let output = arc_cmd() .args(["show", &id]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("diff --arc")); assert!(stdout.contains("-hello")); assert!(stdout.contains("+world")); } #[test] fn show_displays_parent() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "v1\n").unwrap(); let first_id = commit_id(&dir, "first"); std::fs::write(dir.path().join("a.txt"), "v2\n").unwrap(); let second_id = commit_id(&dir, "second"); let output = arc_cmd() .args(["show", &second_id]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("parent")); assert!(stdout.contains(&first_id)); } #[test] fn show_unknown_revision_fails() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "v1\n").unwrap(); commit_id(&dir, "first"); let output = arc_cmd() .args(["show", "nonexistent"]) .current_dir(dir.path()) .output() .expect("failed"); assert!(!output.status.success()); let stderr = String::from_utf8_lossy(&output.stderr); assert!(stderr.contains("unknown revision")); }