use std::collections::{HashMap, HashSet};
pub fn count_referencing_environments<'a>(
references: impl IntoIterator<Item = (&'a str, &'a str)>,
) -> HashMap<String, HashSet<String>> {
let mut usage: HashMap<String, HashSet<String>> = HashMap::new();
for (env_name, basename) in references {
usage
.entry(basename.to_string())
.or_default()
.insert(env_name.to_string());
}
usage
}
pub fn bundled_image_project_path(env_name: &str, basename: &str, referencing_env_count: usize) -> String {
if referencing_env_count > 1 {
format!("assets/images/{basename}")
} else {
format!("assets/images/{env_name}/{basename}")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn env_specific_image_used_by_only_one_environment() {
let usage = count_referencing_environments([("basic_arena", "aiko.jpg"), ("basic_arena", "phoebe.jpg")]);
assert_eq!(usage["aiko.jpg"].len(), 1);
assert_eq!(
bundled_image_project_path("basic_arena", "aiko.jpg", usage["aiko.jpg"].len()),
"assets/images/basic_arena/aiko.jpg"
);
}
#[test]
fn shared_image_used_by_more_than_one_environment() {
let usage = count_referencing_environments([("basic_arena", "logo.jpg"), ("obstacle_course", "logo.jpg")]);
assert_eq!(usage["logo.jpg"].len(), 2);
assert_eq!(
bundled_image_project_path("basic_arena", "logo.jpg", usage["logo.jpg"].len()),
"assets/images/logo.jpg"
);
assert_eq!(
bundled_image_project_path("obstacle_course", "logo.jpg", usage["logo.jpg"].len()),
"assets/images/logo.jpg"
);
}
#[test]
fn duplicate_references_from_the_same_environment_count_once() {
let usage = count_referencing_environments([("basic_arena", "aiko.jpg"), ("basic_arena", "aiko.jpg")]);
assert_eq!(usage["aiko.jpg"].len(), 1);
}
}