use crate::v2_4::aom2::constraint_model::c_defined_object::CDefinedObject;
impl CDefinedObject {
#[must_use]
pub fn has_default_value(&self) -> bool {
match self {
Self::CBoolean(c) => c.default_value.is_some(),
Self::CComplexObject(c) => c.has_default_value(),
Self::CDate(c) => c.default_value.is_some(),
Self::CDateTime(c) => c.default_value.is_some(),
Self::CDuration(c) => c.default_value.is_some(),
Self::CInteger(c) => c.default_value.is_some(),
Self::CReal(c) => c.default_value.is_some(),
Self::CString(c) => c.default_value.is_some(),
Self::CTerminologyCode(c) => c.default_value.is_some(),
Self::CTime(c) => c.default_value.is_some(),
}
}
#[must_use]
pub fn any_allowed(&self) -> bool {
match self {
Self::CBoolean(c) => c.any_allowed(),
Self::CComplexObject(c) => c.any_allowed(),
Self::CString(c) => c.any_allowed(),
Self::CTerminologyCode(c) => c.any_allowed(),
Self::CDate(c) => empty_range_and_pattern(
c.constraint.as_ref().is_none_or(Vec::is_empty),
c.pattern_constraint.as_deref(),
),
Self::CDateTime(c) => empty_range_and_pattern(
c.constraint.as_ref().is_none_or(Vec::is_empty),
c.pattern_constraint.as_deref(),
),
Self::CDuration(c) => empty_range_and_pattern(
c.constraint.as_ref().is_none_or(Vec::is_empty),
c.pattern_constraint.as_deref(),
),
Self::CTime(c) => empty_range_and_pattern(
c.constraint.as_ref().is_none_or(Vec::is_empty),
c.pattern_constraint.as_deref(),
),
Self::CInteger(c) => c.constraint.as_ref().is_none_or(Vec::is_empty),
Self::CReal(c) => c.constraint.as_ref().is_none_or(Vec::is_empty),
}
}
}
fn empty_range_and_pattern(range_empty: bool, pattern: Option<&str>) -> bool {
range_empty && pattern.is_none_or(str::is_empty)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::v2_4::aom2::constraint_model::primitive::c_boolean::CBoolean;
fn boolean(default_value: Option<bool>, constraint: Option<Vec<bool>>) -> CDefinedObject {
CDefinedObject::CBoolean(CBoolean {
parent: None,
soc_parent: None,
rm_type_name: "Boolean".to_owned(),
occurrences: None,
node_id: "at9999".to_owned(),
alternative_ids: None,
is_deprecated: None,
sibling_order: None,
default_value,
assumed_value: None,
is_enumerated_type_constraint: None,
constraint,
})
}
#[test]
fn a_default_value_is_reported_per_descendant() {
assert!(!boolean(None, None).has_default_value());
assert!(boolean(Some(true), None).has_default_value());
}
#[test]
fn any_allowed_dispatches_to_the_descendant_effecting() {
assert!(boolean(None, None).any_allowed());
assert!(!boolean(None, Some(vec![true])).any_allowed());
}
}