use super::*;
use std::fs;
use tempfile::TempDir;
fn mkdir(root: &Path, rel: &str) -> PathBuf {
let p = root.join(rel);
fs::create_dir_all(&p).unwrap();
p
}
fn workspace(root: &Path, rel: &str) -> PathBuf {
let ws = mkdir(root, rel);
fs::create_dir_all(ws.join(REPO_MARK)).unwrap();
ws
}
fn named(name: &str) -> WorkspaceKind {
WorkspaceKind::Named {
name: name.to_owned(),
}
}
#[test]
fn names_root_and_workspace_path_place_the_name_leaf() {
let root = Path::new("/data/yog");
assert_eq!(names_root(root), PathBuf::from("/data/yog/workspaces"));
assert_eq!(
workspace_path(root, "cobalt-gecko"),
PathBuf::from("/data/yog/workspaces/cobalt-gecko"),
);
}
#[test]
fn work_worktree_path_matches_bl_claim_layout() {
let balls = Path::new("/home/u/.local/state/balls");
let project = Path::new("/home/u/dev/yog");
assert_eq!(
work_worktree_path(balls, project, "bl-32d3", None),
PathBuf::from("/home/u/.local/state/balls/plugins/bl-delivery/home/u/dev/yog/bl-32d3"),
);
assert_eq!(
work_worktree_path(balls, project, "bl-32d3", Some("filtered")),
PathBuf::from(
"/home/u/.local/state/balls/plugins/bl-delivery/home/u/dev/yog/bl-32d3-filtered"
),
);
}
#[test]
fn workspaces_classifies_across_three_roots() {
let tmp = TempDir::new().unwrap();
let yog = tmp.path().join("yog");
let litany = tmp.path().join("litany");
let cobalt = workspace(&yog, "workspaces/cobalt-gecko");
let foreign = workspace(&litany, "workspaces/01ABC");
let replay = workspace(&litany, "replays/99XYZ");
mkdir(&yog, "workspaces/half-built");
workspace(&yog, "workspaces/cobalt-gecko/agents/root/child");
fs::write(yog.join("workspaces/NOTES"), b"x").unwrap();
let got = workspaces(&yog, &litany);
assert_eq!(
got,
vec![
Workspace {
path: cobalt,
kind: named("cobalt-gecko"),
},
Workspace {
path: foreign,
kind: WorkspaceKind::Foreign,
},
Workspace {
path: replay,
kind: WorkspaceKind::Replay,
},
],
);
}
#[test]
fn names_root_enumerates_multiple_names_sorted() {
let tmp = TempDir::new().unwrap();
let yog = tmp.path();
let zephyr = workspace(yog, "workspaces/zephyr-mole");
let amber = workspace(yog, "workspaces/amber-toad");
let got = workspaces(yog, &yog.join("absent-litany"));
assert_eq!(
got,
vec![
Workspace {
path: amber,
kind: named("amber-toad"),
},
Workspace {
path: zephyr,
kind: named("zephyr-mole"),
},
],
);
}
#[test]
fn missing_roots_yield_empty() {
let tmp = TempDir::new().unwrap();
let yog = tmp.path().join("absent-yog");
let litany = tmp.path().join("absent-litany");
assert!(workspaces(&yog, &litany).is_empty());
}