#![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
fn is_content_hash(s: &str) -> bool {
s.len() == 64
&& s.bytes()
.all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b))
}
fn extract_version_from_dir_name(dir_name: &str) -> &str {
match dir_name.rsplit_once('-') {
Some((version, tail)) if is_content_hash(tail) => version,
_ => dir_name,
}
}
const HASH: &str = "e8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7c8c7";
#[test]
fn strict_folder_strips_content_hash() {
let dir = format!("1.2.3-{HASH}");
assert_eq!(extract_version_from_dir_name(&dir), "1.2.3");
}
#[test]
fn strict_folder_with_prerelease_preserves_dashes_in_version() {
let dir = format!("1.2.3-rc.1-{HASH}");
assert_eq!(extract_version_from_dir_name(&dir), "1.2.3-rc.1");
}
#[test]
fn version_mode_folder_has_no_hash_suffix() {
assert_eq!(extract_version_from_dir_name("1.2"), "1.2");
assert_eq!(extract_version_from_dir_name("1.2.3"), "1.2.3");
assert_eq!(extract_version_from_dir_name("1.2.3-rc.1"), "1.2.3-rc.1");
}
#[test]
fn short_dashed_suffix_is_not_a_content_hash() {
assert_eq!(
extract_version_from_dir_name("1.2.3-abc123"),
"1.2.3-abc123"
);
}
#[test]
fn uppercase_hex_tail_is_not_a_content_hash() {
let upper = HASH.to_uppercase();
let dir = format!("1.2.3-{upper}");
assert_eq!(extract_version_from_dir_name(&dir), dir);
}
#[test]
fn version_skew_detected_when_versions_differ() {
let running = "1.2.3";
let dir_a = format!("1.2.4-{HASH}");
let dir_b = format!("1.2.2-{HASH}");
let cached = [
extract_version_from_dir_name(&dir_a),
extract_version_from_dir_name(&dir_b),
];
assert!(
!cached.contains(&running),
"version skew should be detected"
);
}
#[test]
fn version_skew_prerelease_vs_release_are_distinct() {
let running = "1.2.3-rc.1";
let dir = format!("1.2.3-{HASH}");
let cached = extract_version_from_dir_name(&dir);
assert_ne!(
cached, running,
"prerelease and release are different versions"
);
}
#[test]
fn is_content_hash_matches_only_64_lowercase_hex() {
assert!(is_content_hash(HASH));
assert!(!is_content_hash("abc123"));
assert!(!is_content_hash(&HASH[..63])); assert!(!is_content_hash(&HASH.to_uppercase())); assert!(!is_content_hash(&format!("{}g", &HASH[..63]))); }