use crate::csaf_traits::{CsafTrait, ProductGroupTrait, ProductTreeTrait};
use crate::validation::ValidationError;
use std::collections::HashMap;
fn generate_multiple_group_id_definition_error(group_id: &str, path: &str) -> ValidationError {
ValidationError {
message: format!("Duplicate definition for product group ID {group_id}"),
instance_path: path.to_owned(),
}
}
pub fn test_6_1_05_multiple_definition_of_product_group_id(doc: &impl CsafTrait) -> Result<(), Vec<ValidationError>> {
let Some(tree) = doc.get_product_tree() else {
return Ok(());
};
let product_groups = tree.get_product_groups();
if product_groups.is_empty() {
return Ok(());
}
let mut product_group_ids_with_paths = HashMap::<String, Vec<String>>::new();
for (i_g, g) in product_groups.iter().enumerate() {
product_group_ids_with_paths
.entry(g.get_group_id().to_owned())
.or_default()
.push(format!("/product_tree/product_groups/{i_g}/group_id"));
}
let errors: Vec<ValidationError> = product_group_ids_with_paths
.iter()
.filter(|(_, paths)| paths.len() > 1)
.flat_map(|(group_id, paths)| {
paths
.iter()
.map(move |path| generate_multiple_group_id_definition_error(group_id, path))
})
.collect();
if errors.is_empty() { Ok(()) } else { Err(errors) }
}
crate::test_validation::impl_validator!(
ValidatorForTest6_1_5,
test_6_1_05_multiple_definition_of_product_group_id
);
#[cfg(test)]
mod tests {
use super::*;
use crate::csaf2_0::testcases::TESTS_2_0;
use crate::csaf2_1::testcases::TESTS_2_1;
#[test]
fn test_test_6_1_05() {
let case_01 = Err(vec![
generate_multiple_group_id_definition_error("CSAFGID-1020300", "/product_tree/product_groups/0/group_id"),
generate_multiple_group_id_definition_error("CSAFGID-1020300", "/product_tree/product_groups/1/group_id"),
]);
let case_s01 = Err(vec![
generate_multiple_group_id_definition_error("CSAFGID-1020300", "/product_tree/product_groups/0/group_id"),
generate_multiple_group_id_definition_error("CSAFGID-1020300", "/product_tree/product_groups/1/group_id"),
generate_multiple_group_id_definition_error("CSAFGID-1020300", "/product_tree/product_groups/2/group_id"),
]);
TESTS_2_0.test_6_1_5.expect(case_01.clone(), case_s01.clone(), Ok(()));
TESTS_2_1.test_6_1_5.expect(case_01, case_s01, Ok(()));
}
}