Add a centralized ui module with Arc's visual identity: colored commit IDs (magenta), bookmarks (cyan), tags (yellow), status symbols, and diff highlighting. Update all command output and tests accordingly.
138 lines
3.6 KiB
Rust
138 lines
3.6 KiB
Rust
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"));
|
|
}
|