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.
172 lines
4.3 KiB
Rust
172 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
|
|
}
|
|
|
|
#[test]
|
|
fn diff_no_changes_after_init() {
|
|
let dir = init_repo();
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed to run arc");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("no changes"));
|
|
}
|
|
|
|
#[test]
|
|
fn diff_shows_added_file() {
|
|
let dir = init_repo();
|
|
std::fs::write(dir.path().join("new.txt"), "hello\n").unwrap();
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("--- /dev/null"));
|
|
assert!(stdout.contains("+++ b/new.txt"));
|
|
assert!(stdout.contains("+hello"));
|
|
}
|
|
|
|
#[test]
|
|
fn diff_shows_modified_file() {
|
|
let dir = init_repo();
|
|
std::fs::write(dir.path().join("file.txt"), "original\n").unwrap();
|
|
|
|
arc_cmd()
|
|
.args(["commit", "add"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
std::fs::write(dir.path().join("file.txt"), "modified\n").unwrap();
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("--- a/file.txt"));
|
|
assert!(stdout.contains("+++ b/file.txt"));
|
|
assert!(stdout.contains("-original"));
|
|
assert!(stdout.contains("+modified"));
|
|
}
|
|
|
|
#[test]
|
|
fn diff_shows_deleted_file() {
|
|
let dir = init_repo();
|
|
std::fs::write(dir.path().join("gone.txt"), "bye\n").unwrap();
|
|
|
|
arc_cmd()
|
|
.args(["commit", "add"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
std::fs::remove_file(dir.path().join("gone.txt")).unwrap();
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("--- a/gone.txt"));
|
|
assert!(stdout.contains("+++ /dev/null"));
|
|
assert!(stdout.contains("-bye"));
|
|
}
|
|
|
|
#[test]
|
|
fn diff_no_changes_after_commit() {
|
|
let dir = init_repo();
|
|
std::fs::write(dir.path().join("file.txt"), "content\n").unwrap();
|
|
|
|
arc_cmd()
|
|
.args(["commit", "add"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("no changes"));
|
|
}
|
|
|
|
#[test]
|
|
fn diff_outside_repo_fails() {
|
|
let dir = TempDir::new().unwrap();
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(!output.status.success());
|
|
}
|
|
|
|
#[test]
|
|
fn diff_shows_header_with_path() {
|
|
let dir = init_repo();
|
|
std::fs::write(dir.path().join("test.txt"), "line\n").unwrap();
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("diff --arc a/test.txt b/test.txt"));
|
|
}
|
|
|
|
#[test]
|
|
fn diff_ignores_arcignore_patterns() {
|
|
let dir = init_repo();
|
|
std::fs::write(dir.path().join(".arcignore"), "*.tmp\n").unwrap();
|
|
std::fs::write(dir.path().join("ignored.tmp"), "temp\n").unwrap();
|
|
|
|
let output = arc_cmd()
|
|
.arg("diff")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(!stdout.contains("ignored.tmp"));
|
|
}
|