use super::{EdgeKind, EdgeKindError};
#[test]
fn edge_kind_score_multiplier_known_values() {
assert!((EdgeKind::Implements.score_multiplier() - 0.85).abs() < 1e-6);
assert!((EdgeKind::UsesType.score_multiplier() - 0.75).abs() < 1e-6);
assert!((EdgeKind::TestedBy.score_multiplier() - 0.80).abs() < 1e-6);
assert!((EdgeKind::Documents.score_multiplier() - 0.65).abs() < 1e-6);
assert!((EdgeKind::ReferencesConcept.score_multiplier() - 0.60).abs() < 1e-6);
assert!((EdgeKind::Writes.score_multiplier() - 0.90).abs() < 1e-6);
assert!((EdgeKind::Reads.score_multiplier() - 0.80).abs() < 1e-6);
assert!((EdgeKind::AccessesResource.score_multiplier() - 0.75).abs() < 1e-6);
assert!((EdgeKind::CallsFunction.score_multiplier() - 0.70).abs() < 1e-6);
assert!((EdgeKind::Calls.score_multiplier() - 0.70).abs() < 1e-6);
assert!((EdgeKind::Custom("foo".to_string()).score_multiplier() - 0.70).abs() < 1e-6);
}
#[test]
fn edge_kind_custom_tag_round_trip() {
let v = EdgeKind::Custom("foo".to_string());
let tag = v.tag();
assert_eq!(tag.as_ref(), "custom:foo");
let back = EdgeKind::from_tag(&tag).expect("Custom should parse from custom: tag");
assert_eq!(back, v);
}
#[test]
fn edge_kind_unknown_bare_tag_returns_none() {
assert!(EdgeKind::from_tag("UnknownFutureEdge").is_none());
assert!(EdgeKind::from_tag("SomeTypo").is_none());
}
#[test]
fn edge_kind_named_tag_not_treated_as_custom() {
let tag = EdgeKind::CallsFunction.tag();
assert_eq!(tag.as_ref(), "CallsFunction");
let back = EdgeKind::from_tag(&tag).expect("named tag round-trips");
assert_eq!(back, EdgeKind::CallsFunction);
}
#[test]
fn edge_kind_serde_round_trip() {
let variants = vec![
EdgeKind::CallsFunction,
EdgeKind::CalledByFunction,
EdgeKind::Implements,
EdgeKind::UsesType,
EdgeKind::Derives,
EdgeKind::ModuleContains,
EdgeKind::ReExports,
EdgeKind::RaisesError,
EdgeKind::Configures,
EdgeKind::TestedBy,
EdgeKind::TestUsesFixture,
EdgeKind::CoOccursInTest,
EdgeKind::Documents,
EdgeKind::ReferencesConcept,
EdgeKind::Aliases,
EdgeKind::ErrorDescribes,
EdgeKind::Contains,
EdgeKind::Imports,
EdgeKind::Exports,
EdgeKind::Calls,
EdgeKind::Extends,
EdgeKind::References,
EdgeKind::Tests,
EdgeKind::DependsOn,
EdgeKind::GeneratedFrom,
EdgeKind::RuntimeObservationFor,
EdgeKind::Reads,
EdgeKind::Writes,
EdgeKind::AccessesResource,
EdgeKind::Custom("reads_table".to_string()),
];
for v in &variants {
let json = serde_json::to_string(v).expect("serialize EdgeKind");
let back: EdgeKind = serde_json::from_str(&json).expect("deserialize EdgeKind");
assert_eq!(*v, back, "round-trip failed for {json}");
}
}
#[test]
fn edge_kind_union_coverage() {
let variants: Vec<EdgeKind> = vec![
EdgeKind::CallsFunction,
EdgeKind::CalledByFunction,
EdgeKind::Implements,
EdgeKind::UsesType,
EdgeKind::Derives,
EdgeKind::ModuleContains,
EdgeKind::ReExports,
EdgeKind::RaisesError,
EdgeKind::Configures,
EdgeKind::TestedBy,
EdgeKind::TestUsesFixture,
EdgeKind::CoOccursInTest,
EdgeKind::Documents,
EdgeKind::ReferencesConcept,
EdgeKind::Aliases,
EdgeKind::ErrorDescribes,
EdgeKind::Contains,
EdgeKind::Imports,
EdgeKind::Exports,
EdgeKind::Calls,
EdgeKind::Extends,
EdgeKind::References,
EdgeKind::Tests,
EdgeKind::DependsOn,
EdgeKind::GeneratedFrom,
EdgeKind::RuntimeObservationFor,
EdgeKind::Reads,
EdgeKind::Writes,
EdgeKind::AccessesResource,
EdgeKind::Custom("any".to_string()),
];
assert_eq!(
variants.len(),
30,
"update this count when adding a variant"
);
for v in &variants {
let tag = v.tag();
assert!(!tag.is_empty(), "tag() must be non-empty for {v:?}");
let back = EdgeKind::from_tag(&tag)
.unwrap_or_else(|| panic!("from_tag round-trip failed for {tag:?}"));
assert_eq!(back, *v, "round-trip failed for {tag:?}");
}
}
#[test]
fn edge_kind_custom_constructor_rejects_invalid() {
assert_eq!(EdgeKind::custom(""), Err(EdgeKindError::EmptyLabel));
assert_eq!(
EdgeKind::custom("custom:foo"),
Err(EdgeKindError::LabelContainsColon("custom:foo".to_string()))
);
assert_eq!(
EdgeKind::custom("foo:bar"),
Err(EdgeKindError::LabelContainsColon("foo:bar".to_string()))
);
assert_eq!(
EdgeKind::custom("reads_table"),
Ok(EdgeKind::Custom("reads_table".to_string()))
);
assert_eq!(
EdgeKind::custom("my-rel"),
Ok(EdgeKind::Custom("my-rel".to_string()))
);
}
#[test]
fn edge_kind_from_tag_rejects_malformed_custom() {
assert!(
EdgeKind::from_tag("custom:").is_none(),
"empty custom suffix must return None"
);
assert!(
EdgeKind::from_tag("custom:foo:bar").is_none(),
"colon-containing custom suffix must return None"
);
assert!(
EdgeKind::from_tag("custom:custom:foo").is_none(),
"double-prefix must return None"
);
assert_eq!(
EdgeKind::from_tag("custom:reads_table"),
Some(EdgeKind::Custom("reads_table".to_string()))
);
}