use super::*;
#[test]
fn tool_support_parity_carries_its_provenance() {
let artifact = artifact();
let mut declared = 0;
let mut derived = 0;
for model in &artifact.models {
let support = &model.tool_support;
match (support.parity.as_deref(), support.parity_source.as_deref()) {
(Some(_), Some("declared")) => declared += 1,
(Some(_), Some("derived")) => derived += 1,
(verdict, source) => panic!(
"{}/{}: parity {verdict:?} must carry a declared/derived source, got {source:?}",
model.provider, model.id
),
}
}
assert!(declared > 0 && derived > 0, "expected both provenances");
let mut sources_by_verdict: std::collections::BTreeMap<&str, std::collections::BTreeSet<&str>> =
Default::default();
for model in &artifact.models {
if let (Some(parity), Some(source)) = (
model.tool_support.parity.as_deref(),
model.tool_support.parity_source.as_deref(),
) {
sources_by_verdict.entry(parity).or_default().insert(source);
}
}
let dual_sourced: Vec<&str> = sources_by_verdict
.iter()
.filter(|(_, sources)| sources.contains("declared") && sources.contains("derived"))
.map(|(verdict, _)| *verdict)
.collect();
assert!(
!dual_sourced.is_empty(),
"at least one parity verdict must be reachable BOTH ways, or the field would be \
unambiguous and `parity_source` would have nothing to disambiguate; \
verdict sources today: {sources_by_verdict:?}"
);
}
#[test]
fn generated_schema_declares_the_parity_source_vocabulary() {
assert_eq!(
schema_value()["$defs"]["tool_support"]["properties"]["parity_source"]["enum"],
serde_json::json!(["declared", "derived"])
);
}