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 log_shows_single_commit() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "hello\n").unwrap(); commit_id(&dir, "initial commit"); let output = arc_cmd() .arg("log") .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("initial commit")); assert!(stdout.contains("●")); } #[test] fn log_shows_multiple_commits_newest_first() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "v1\n").unwrap(); commit_id(&dir, "first"); std::fs::write(dir.path().join("a.txt"), "v2\n").unwrap(); commit_id(&dir, "second"); std::fs::write(dir.path().join("a.txt"), "v3\n").unwrap(); commit_id(&dir, "third"); let output = arc_cmd() .arg("log") .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); let first_pos = stdout.find("first").unwrap(); let second_pos = stdout.find("second").unwrap(); let third_pos = stdout.find("third").unwrap(); assert!(third_pos < second_pos); assert!(second_pos < first_pos); } #[test] fn log_fails_on_empty_repo() { let dir = init_repo(); let output = arc_cmd() .arg("log") .current_dir(dir.path()) .output() .expect("failed"); assert!(!output.status.success()); } #[test] fn log_with_single_commit_range() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "v1\n").unwrap(); let id1 = commit_id(&dir, "first"); std::fs::write(dir.path().join("a.txt"), "v2\n").unwrap(); commit_id(&dir, "second"); let short = &id1[..12]; let output = arc_cmd() .args(["log", short]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("first")); assert!(!stdout.contains("second")); } #[test] fn log_with_range() { let dir = init_repo(); std::fs::write(dir.path().join("a.txt"), "v1\n").unwrap(); let id1 = commit_id(&dir, "first"); std::fs::write(dir.path().join("a.txt"), "v2\n").unwrap(); commit_id(&dir, "second"); std::fs::write(dir.path().join("a.txt"), "v3\n").unwrap(); commit_id(&dir, "third"); let range = format!("{}..", &id1[..12]); let output = arc_cmd() .args(["log", &range]) .current_dir(dir.path()) .output() .expect("failed"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("first")); assert!(stdout.contains("second")); assert!(stdout.contains("third")); }