#![allow(clippy::unwrap_used, clippy::expect_used)]
use prism::pipeline::{validate_constrained_type, ConstrainedTypeShape};
use prism::std_types::{
Bool, Bytes, Char, FixedSites, F32, F64, I128, I16, I256, I32, I64, I8, U128, U16, U256, U32,
U64, U8,
};
const SHARED_IRI: &str = "https://uor.foundation/type/ConstrainedType";
#[test]
fn integer_byte_widths_match_catalog() {
assert_eq!(<U8 as ConstrainedTypeShape>::SITE_COUNT, 1);
assert_eq!(<U16 as ConstrainedTypeShape>::SITE_COUNT, 2);
assert_eq!(<U32 as ConstrainedTypeShape>::SITE_COUNT, 4);
assert_eq!(<U64 as ConstrainedTypeShape>::SITE_COUNT, 8);
assert_eq!(<U128 as ConstrainedTypeShape>::SITE_COUNT, 16);
assert_eq!(<U256 as ConstrainedTypeShape>::SITE_COUNT, 32);
assert_eq!(<I8 as ConstrainedTypeShape>::SITE_COUNT, 1);
assert_eq!(<I16 as ConstrainedTypeShape>::SITE_COUNT, 2);
assert_eq!(<I32 as ConstrainedTypeShape>::SITE_COUNT, 4);
assert_eq!(<I64 as ConstrainedTypeShape>::SITE_COUNT, 8);
assert_eq!(<I128 as ConstrainedTypeShape>::SITE_COUNT, 16);
assert_eq!(<I256 as ConstrainedTypeShape>::SITE_COUNT, 32);
}
#[test]
fn float_byte_widths_match_catalog() {
assert_eq!(<F32 as ConstrainedTypeShape>::SITE_COUNT, 4);
assert_eq!(<F64 as ConstrainedTypeShape>::SITE_COUNT, 8);
}
#[test]
fn other_baseline_widths_match_catalog() {
assert_eq!(<Bool as ConstrainedTypeShape>::SITE_COUNT, 1);
assert_eq!(<Char as ConstrainedTypeShape>::SITE_COUNT, 4);
assert_eq!(<Bytes<7> as ConstrainedTypeShape>::SITE_COUNT, 7);
assert_eq!(<FixedSites<7> as ConstrainedTypeShape>::SITE_COUNT, 7);
}
#[test]
fn every_baseline_iri_is_the_foundation_class_iri() {
let assert_shared = |iri: &str, name: &str| {
assert_eq!(
iri, SHARED_IRI,
"{name}'s IRI must equal foundation's ConstrainedType class IRI",
);
};
assert_shared(<U8 as ConstrainedTypeShape>::IRI, "U8");
assert_shared(<U16 as ConstrainedTypeShape>::IRI, "U16");
assert_shared(<U32 as ConstrainedTypeShape>::IRI, "U32");
assert_shared(<U64 as ConstrainedTypeShape>::IRI, "U64");
assert_shared(<U128 as ConstrainedTypeShape>::IRI, "U128");
assert_shared(<U256 as ConstrainedTypeShape>::IRI, "U256");
assert_shared(<I8 as ConstrainedTypeShape>::IRI, "I8");
assert_shared(<I16 as ConstrainedTypeShape>::IRI, "I16");
assert_shared(<I32 as ConstrainedTypeShape>::IRI, "I32");
assert_shared(<I64 as ConstrainedTypeShape>::IRI, "I64");
assert_shared(<I128 as ConstrainedTypeShape>::IRI, "I128");
assert_shared(<I256 as ConstrainedTypeShape>::IRI, "I256");
assert_shared(<F32 as ConstrainedTypeShape>::IRI, "F32");
assert_shared(<F64 as ConstrainedTypeShape>::IRI, "F64");
assert_shared(<Bool as ConstrainedTypeShape>::IRI, "Bool");
assert_shared(<Char as ConstrainedTypeShape>::IRI, "Char");
assert_shared(<Bytes<32> as ConstrainedTypeShape>::IRI, "Bytes");
assert_shared(<FixedSites<32> as ConstrainedTypeShape>::IRI, "FixedSites");
}
#[test]
fn admission_succeeds_for_every_baseline_type() {
validate_constrained_type(U8).expect("U8 admissible");
validate_constrained_type(U16).expect("U16 admissible");
validate_constrained_type(U32).expect("U32 admissible");
validate_constrained_type(U64).expect("U64 admissible");
validate_constrained_type(U128).expect("U128 admissible");
validate_constrained_type(U256).expect("U256 admissible");
validate_constrained_type(I8).expect("I8 admissible");
validate_constrained_type(I16).expect("I16 admissible");
validate_constrained_type(I32).expect("I32 admissible");
validate_constrained_type(I64).expect("I64 admissible");
validate_constrained_type(I128).expect("I128 admissible");
validate_constrained_type(I256).expect("I256 admissible");
validate_constrained_type(F32).expect("F32 admissible");
validate_constrained_type(F64).expect("F64 admissible");
validate_constrained_type(Bool).expect("Bool admissible");
validate_constrained_type(Char).expect("Char admissible");
validate_constrained_type(Bytes::<32>).expect("Bytes<32> admissible");
validate_constrained_type(FixedSites::<32>).expect("FixedSites<32> admissible");
}
#[test]
fn paired_signed_and_unsigned_share_iri_per_closure() {
assert_eq!(
<U32 as ConstrainedTypeShape>::SITE_COUNT,
<I32 as ConstrainedTypeShape>::SITE_COUNT,
);
assert_eq!(
<U32 as ConstrainedTypeShape>::IRI,
<I32 as ConstrainedTypeShape>::IRI,
);
}
#[test]
fn semantic_aliases_share_iri_at_equal_constraints() {
assert_eq!(<Bool as ConstrainedTypeShape>::SITE_COUNT, 1);
assert_eq!(<U8 as ConstrainedTypeShape>::SITE_COUNT, 1);
assert_eq!(<I8 as ConstrainedTypeShape>::SITE_COUNT, 1);
assert_eq!(<FixedSites<1> as ConstrainedTypeShape>::SITE_COUNT, 1);
assert_eq!(
<Bool as ConstrainedTypeShape>::IRI,
<U8 as ConstrainedTypeShape>::IRI,
);
assert_eq!(
<U8 as ConstrainedTypeShape>::IRI,
<I8 as ConstrainedTypeShape>::IRI,
);
assert_eq!(
<Bool as ConstrainedTypeShape>::IRI,
<FixedSites<1> as ConstrainedTypeShape>::IRI,
);
}
#[test]
fn bytes_and_fixed_sites_share_iri_at_equal_width() {
assert_eq!(
<Bytes<32> as ConstrainedTypeShape>::SITE_COUNT,
<FixedSites<32> as ConstrainedTypeShape>::SITE_COUNT,
);
assert_eq!(
<Bytes<32> as ConstrainedTypeShape>::IRI,
<FixedSites<32> as ConstrainedTypeShape>::IRI,
);
}
#[test]
fn distinct_site_counts_distinguish_via_constraint_declaration() {
assert_eq!(
<U8 as ConstrainedTypeShape>::IRI,
<U32 as ConstrainedTypeShape>::IRI,
);
assert_ne!(
<U8 as ConstrainedTypeShape>::SITE_COUNT,
<U32 as ConstrainedTypeShape>::SITE_COUNT,
);
}
#[test]
fn all_baseline_primitives_have_empty_constraints() {
assert!(<U8 as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
assert!(<U256 as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
assert!(<I256 as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
assert!(<F32 as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
assert!(<F64 as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
assert!(<Bool as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
assert!(<Char as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
assert!(<Bytes<32> as ConstrainedTypeShape>::CONSTRAINTS.is_empty());
}