#![allow(clippy::unwrap_used)]
#![allow(unused_imports)]
use super::*;
#[test]
fn loss_code_serializes_as_namespaced_object() {
let note = LossNote {
code: LossKind::shared(LossTaxonomy::TopologyNotTransferred),
severity: Severity::Blocking,
message: "topology graph not transferred".to_owned(),
provenance: None,
};
let value: serde_json::Value = serde_json::to_value(¬e).expect("required invariant");
assert_eq!(value["code"]["namespace"], SHARED_LOSS_NAMESPACE);
assert_eq!(value["code"]["code"], "topology_not_transferred");
assert_eq!(value["code"]["kind"], "topology_not_transferred");
assert!(value["code"].get("strict_floor").is_none());
assert_eq!(
note.code.as_str(),
format!("{SHARED_LOSS_NAMESPACE}/topology_not_transferred")
);
}
#[test]
fn loss_kind_strict_consequence_depends_on_severity() {
assert_eq!(
LossNote::new(
LossKind::shared(LossTaxonomy::TopologyNotTransferred),
"missing topology"
)
.strict_consequence(),
StrictConsequence::Reject
);
assert_eq!(
LossNote::new(
LossKind::shared(LossTaxonomy::TopologyNotTransferred),
"diagnostic"
)
.with_severity(Severity::Info)
.strict_consequence(),
StrictConsequence::Tolerate
);
assert_eq!(
LossNote::new(
LossKind::shared(LossTaxonomy::PassthroughRecordOmitted),
"retained source"
)
.strict_consequence(),
StrictConsequence::Tolerate
);
}
#[test]
fn assembly_losses_belong_to_the_product_domain() {
assert_eq!(
LossKind::shared(LossTaxonomy::AssemblyComponentsExternal).category(),
LossCategory::Product
);
assert_eq!(
LossKind::shared(LossTaxonomy::AssemblyPlacementsNotTransferred).category(),
LossCategory::Product
);
assert_eq!(
LossKind::shared(LossTaxonomy::AssemblyPlacementsNotTransferred).as_str(),
format!("{SHARED_LOSS_NAMESPACE}/assembly_placements_not_transferred")
);
}
#[test]
fn noncanonical_source_syntax_is_a_strict_rejectable_warning() {
let kind = LossKind::shared(LossTaxonomy::NoncanonicalSourceSyntax);
assert_eq!(
kind.as_str(),
format!("{SHARED_LOSS_NAMESPACE}/noncanonical_source_syntax")
);
assert_eq!(kind.category(), LossCategory::Other);
assert_eq!(kind.default_severity(), Severity::Warning);
assert_eq!(kind.strict_floor(), Some(Severity::Warning));
assert_eq!(
LossNote::new(kind, "source order is noncanonical").strict_consequence(),
StrictConsequence::Reject
);
}
#[test]
fn integrity_failure_is_a_strict_rejectable_error() {
let kind = LossKind::shared(LossTaxonomy::IntegrityFailure);
assert_eq!(
kind.as_str(),
format!("{SHARED_LOSS_NAMESPACE}/integrity_failure")
);
assert_eq!(kind.category(), LossCategory::Other);
assert_eq!(kind.default_severity(), Severity::Error);
assert_eq!(kind.strict_floor(), Some(Severity::Warning));
assert_eq!(
LossNote::new(kind, "stored checksum differs").strict_consequence(),
StrictConsequence::Reject
);
}
#[test]
fn namespaced_local_code_pins_strict_floor_independently_of_taxonomy() {
let kind = LossKind::namespaced(
"sldprt",
"geometry.pcurve-ambiguous",
LossTaxonomy::PcurveOmitted,
)
.with_strict_floor(None);
let roundtrip: LossKind = serde_json::from_value(serde_json::to_value(&kind).unwrap()).unwrap();
assert_eq!(roundtrip.namespace(), "sldprt");
assert_eq!(roundtrip.local_code(), "geometry.pcurve-ambiguous");
assert_eq!(roundtrip.taxonomy(), LossTaxonomy::PcurveOmitted);
assert_eq!(roundtrip.strict_floor(), None);
assert_eq!(
LossNote::new(roundtrip, "ambiguous").strict_consequence(),
StrictConsequence::Tolerate
);
}
#[test]
fn loss_provenance_root_alias_constructs_and_serializes() {
let note = LossNote {
code: LossKind::shared(LossTaxonomy::GeometryNotTransferred),
severity: Severity::Warning,
message: "geometry was retained as metadata".into(),
provenance: Some(SourceProvenance {
format: "rhino".into(),
stream: String::new(),
offset: 42,
tag: Some(
"OBJECT_RECORD/class=00000000-0000-0000-0000-000000000000/type=0x00000020".into(),
),
}),
};
let json = serde_json::to_value(¬e).unwrap();
assert_eq!(json["provenance"]["format"], "rhino");
assert_eq!(json["provenance"]["stream"], "");
assert_eq!(json["provenance"]["offset"], 42);
assert_eq!(
json["provenance"]["tag"],
"OBJECT_RECORD/class=00000000-0000-0000-0000-000000000000/type=0x00000020"
);
}