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.
165 lines
4.3 KiB
Rust
165 lines
4.3 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 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"));
|
|
}
|