use super::*;
fn no_resolution() -> Resolution {
Resolution {
roots: HashMap::new(),
gap_filled: Vec::new(),
bridges: Vec::new(),
}
}
fn clip_with_id(id: &str) -> Clip {
Clip {
id: id.to_owned(),
title: "Song".to_owned(),
clip_type: "gen".to_owned(),
display_name: "alice".to_owned(),
..Default::default()
}
}
fn store_with_ids(ids: &[&str]) -> LineageStore {
let clips: Vec<Clip> = ids.iter().map(|id| clip_with_id(id)).collect();
let mut store = LineageStore::new();
store.update(&clips, &no_resolution(), "now");
store
}
#[test]
fn colliding_clip_ids_flags_shared_id8_prefixes() {
let store = store_with_ids(&["abcd1234-aaaa", "abcd1234-bbbb", "zzzz9999-cccc"]);
let colliding = store.colliding_clip_ids();
assert!(colliding.contains("abcd1234-aaaa"));
assert!(colliding.contains("abcd1234-bbbb"));
assert!(!colliding.contains("zzzz9999-cccc"));
assert_eq!(colliding.len(), 2);
}
#[test]
fn colliding_clip_ids_remembers_trashed_and_purged_twins() {
let mut trashed = clip_with_id("abcd1234-gone");
trashed.is_trashed = true;
let live = clip_with_id("abcd1234-live");
let mut store = LineageStore::new();
store.update(&[live.clone(), trashed], &no_resolution(), "now");
let colliding = store.colliding_clip_ids();
assert!(colliding.contains("abcd1234-live"));
assert!(
colliding.contains("abcd1234-gone"),
"a trashed twin must still pin the suffix"
);
store.update(&[live], &no_resolution(), "later");
let after = store.colliding_clip_ids();
assert!(after.contains("abcd1234-live"));
assert!(
after.contains("abcd1234-gone"),
"a purged twin remembered by the store must still pin the suffix"
);
}
#[test]
fn colliding_clip_ids_empty_for_unique_library() {
let store = store_with_ids(&["aaaa1111-x", "bbbb2222-y", "cccc3333-z"]);
assert!(store.colliding_clip_ids().is_empty());
}
#[test]
fn colliding_clip_ids_empty_for_empty_store() {
let store = LineageStore::new();
assert!(store.colliding_clip_ids().is_empty());
}
#[test]
fn colliding_clip_ids_uses_first_eight_chars() {
let store = store_with_ids(&[
"aaaaaaaa-one",
"aaaaaaaa-two", "bbbbbbbc-1",
"bbbbbbbd-1", ]);
let colliding = store.colliding_clip_ids();
assert!(colliding.contains("aaaaaaaa-one"));
assert!(colliding.contains("aaaaaaaa-two"));
assert!(!colliding.contains("bbbbbbbc-1"));
assert!(!colliding.contains("bbbbbbbd-1"));
assert_eq!(colliding.len(), 2);
}
#[test]
fn colliding_clip_ids_key_case_matches_rendered_id8() {
let store = store_with_ids(&["ABCD1234-x", "abcd1234-y"]);
let colliding = store.colliding_clip_ids();
assert!(colliding.contains("ABCD1234-x"));
assert!(colliding.contains("abcd1234-y"));
assert_eq!(colliding.len(), 2);
let upper = clip_with_id("ABCD1234-x");
let lineage = LineageContext::own_root(&upper);
let rendered = crate::naming::render_clip_name(
crate::naming::NamingRequest {
clip: &upper,
lineage: &lineage,
},
&crate::naming::NamingConfig::default(),
);
assert!(
rendered
.base_name
.to_ascii_lowercase()
.contains("[abcd1234]"),
"rendered id8 {:?} folds to the store key `abcd1234`",
rendered.base_name
);
}