use proptest::prelude::*;
use trust_tasks_rs::{StandardCode, TrustTaskCode, TypeUri};
fn slug_strategy() -> impl Strategy<Value = String> {
proptest::collection::vec("[a-z][a-z0-9]{0,5}", 1..4).prop_map(|segs| segs.join("/"))
}
proptest! {
#[test]
fn type_uri_round_trips(slug in slug_strategy(), major in 0u32..1000, minor in 0u32..1000, frag in 0u8..3) {
let base = TypeUri::canonical(&slug, major, minor).expect("canonical Type URI");
let uri = match frag {
0 => base,
1 => base.with_request(),
_ => base.with_response(),
};
let s = uri.to_string();
let parsed: TypeUri = s.parse().expect("round-trip parse");
prop_assert_eq!(&parsed, &uri);
prop_assert_eq!(parsed.to_string(), s);
}
#[test]
fn type_uri_from_str_never_panics(s in any::<String>()) {
let _ = s.parse::<TypeUri>();
}
#[test]
fn extended_code_round_trips(slug in slug_strategy(), local in "[a-z][a-zA-Z0-9_]{0,8}") {
let raw = format!("{slug}:{local}");
let code: TrustTaskCode = raw.parse().expect("parse extended code");
prop_assert!(matches!(code, TrustTaskCode::Extended { .. }), "expected Extended variant");
prop_assert_eq!(code.to_string(), raw);
}
#[test]
fn trust_task_code_from_str_never_panics(s in any::<String>()) {
let _ = s.parse::<TrustTaskCode>();
}
}
#[test]
fn camel_and_snake_extended_locals_parse() {
for raw in [
"acl/change-role:lastAuthorityProtected", "kyc-handoff:documentRevoked", "acl/grant:permission_denied", ] {
let code: TrustTaskCode = raw.parse().unwrap_or_else(|e| panic!("parse {raw}: {e}"));
assert!(matches!(code, TrustTaskCode::Extended { .. }));
assert_eq!(code.to_string(), raw);
}
}
#[test]
fn all_standard_codes_round_trip() {
for c in [
StandardCode::MalformedRequest,
StandardCode::UnsupportedType,
StandardCode::UnsupportedVersion,
StandardCode::Expired,
StandardCode::ProofRequired,
StandardCode::ProofInvalid,
StandardCode::PermissionDenied,
StandardCode::WrongRecipient,
StandardCode::IdentityMismatch,
StandardCode::TaskFailed,
StandardCode::Unavailable,
StandardCode::InternalError,
] {
let parsed: TrustTaskCode = c.as_str().parse().unwrap();
assert_eq!(parsed, TrustTaskCode::Standard(c));
}
}