use uor_foundation::enforcement::{
resolver, CompileUnit, CompileUnitBuilder, ConstrainedTypeInput, Term, Validated,
};
use uor_foundation::pipeline::validate_compile_unit_const;
use uor_foundation::{VerificationDomain, WittLevel};
use uor_foundation_test_helpers::{validated_runtime, Fnv1aHasher16};
static SENTINEL_TERMS: &[Term] = &[Term::Literal {
value: 1,
level: WittLevel::W8,
}];
static SENTINEL_DOMAINS: &[VerificationDomain] = &[VerificationDomain::Enumerative];
fn build_unit() -> Validated<CompileUnit<'static>, uor_foundation::enforcement::CompileTime> {
let b = CompileUnitBuilder::new()
.root_term(SENTINEL_TERMS)
.witt_level_ceiling(WittLevel::W32)
.thermodynamic_budget(100)
.target_domains(SENTINEL_DOMAINS)
.result_type::<ConstrainedTypeInput>();
validate_compile_unit_const(&b).expect("fixture")
}
#[test]
fn homotopy_is_deterministic_across_calls() {
let input = validated_runtime(ConstrainedTypeInput::default());
let a = resolver::homotopy::certify::<_, _, Fnv1aHasher16>(&input).expect("a");
let b = resolver::homotopy::certify::<_, _, Fnv1aHasher16>(&input).expect("b");
assert_eq!(
a.certificate().content_fingerprint(),
b.certificate().content_fingerprint(),
);
}
#[test]
fn measurement_is_deterministic_across_calls() {
let unit = build_unit();
let a = resolver::measurement::certify::<_, Fnv1aHasher16>(&unit).expect("a");
let b = resolver::measurement::certify::<_, Fnv1aHasher16>(&unit).expect("b");
assert_eq!(
a.certificate().content_fingerprint(),
b.certificate().content_fingerprint(),
);
}
#[test]
fn dihedral_factorization_is_deterministic_across_calls() {
let input = validated_runtime(ConstrainedTypeInput::default());
let a = resolver::dihedral_factorization::certify::<_, _, Fnv1aHasher16>(&input).expect("a");
let b = resolver::dihedral_factorization::certify::<_, _, Fnv1aHasher16>(&input).expect("b");
assert_eq!(
a.certificate().content_fingerprint(),
b.certificate().content_fingerprint(),
);
}
#[test]
fn homotopy_fingerprint_changes_with_level() {
let input = validated_runtime(ConstrainedTypeInput::default());
let at_w8 =
resolver::homotopy::certify_at::<_, _, Fnv1aHasher16>(&input, WittLevel::W8).expect("w8");
let at_w32 =
resolver::homotopy::certify_at::<_, _, Fnv1aHasher16>(&input, WittLevel::W32).expect("w32");
assert_ne!(
at_w8.certificate().content_fingerprint(),
at_w32.certificate().content_fingerprint(),
);
assert_eq!(at_w8.certificate().witt_bits(), 8);
assert_eq!(at_w32.certificate().witt_bits(), 32);
}
#[test]
fn monodromy_fingerprint_changes_with_level() {
let input = validated_runtime(ConstrainedTypeInput::default());
let at_w8 =
resolver::monodromy::certify_at::<_, _, Fnv1aHasher16>(&input, WittLevel::W8).expect("w8");
let at_w32 = resolver::monodromy::certify_at::<_, _, Fnv1aHasher16>(&input, WittLevel::W32)
.expect("w32");
assert_ne!(
at_w8.certificate().content_fingerprint(),
at_w32.certificate().content_fingerprint(),
);
}
#[test]
fn homotopy_differs_from_moduli() {
let input = validated_runtime(ConstrainedTypeInput::default());
let homo = resolver::homotopy::certify::<_, _, Fnv1aHasher16>(&input).expect("homo");
let moduli = resolver::moduli::certify::<_, _, Fnv1aHasher16>(&input).expect("moduli");
assert_ne!(
homo.certificate().content_fingerprint(),
moduli.certificate().content_fingerprint(),
"homotopy and moduli share SimplicialNerve but moduli folds an extra 0xB0 marker; \
fingerprints must differ"
);
}
#[test]
fn monodromy_differs_from_dihedral_factorization() {
let input = validated_runtime(ConstrainedTypeInput::default());
let mono = resolver::monodromy::certify::<_, _, Fnv1aHasher16>(&input).expect("mono");
let dihedral =
resolver::dihedral_factorization::certify::<_, _, Fnv1aHasher16>(&input).expect("dihedral");
assert_ne!(
mono.certificate().content_fingerprint(),
dihedral.certificate().content_fingerprint(),
"monodromy folds Betti + Dihedral; dihedral_factorization folds only Dihedral — \
fingerprints must differ"
);
}
#[test]
fn jacobian_guided_differs_from_geodesic_validator() {
let input = validated_runtime(ConstrainedTypeInput::default());
let jac = resolver::jacobian_guided::certify::<_, _, Fnv1aHasher16>(&input).expect("jac");
let geo = resolver::geodesic_validator::certify::<_, _, Fnv1aHasher16>(&input).expect("geo");
assert_ne!(
jac.certificate().content_fingerprint(),
geo.certificate().content_fingerprint(),
);
}
#[test]
fn session_differs_from_superposition() {
let unit = build_unit();
let session = resolver::session::certify::<_, Fnv1aHasher16>(&unit).expect("session");
let superp = resolver::superposition::certify::<_, Fnv1aHasher16>(&unit).expect("superp");
assert_ne!(
session.certificate().content_fingerprint(),
superp.certificate().content_fingerprint(),
);
}
#[test]
fn measurement_differs_from_superposition() {
let unit = build_unit();
let meas = resolver::measurement::certify::<_, Fnv1aHasher16>(&unit).expect("meas");
let superp = resolver::superposition::certify::<_, Fnv1aHasher16>(&unit).expect("superp");
assert_ne!(
meas.certificate().content_fingerprint(),
superp.certificate().content_fingerprint(),
);
}
#[test]
fn canonical_form_differs_from_terminal_reduction_only_kernels() {
let input = validated_runtime(ConstrainedTypeInput::default());
let canon = resolver::canonical_form::certify::<_, _, Fnv1aHasher16>(&input).expect("canon");
let twosat =
resolver::two_sat_decider::certify::<_, _, Fnv1aHasher16>(&input).expect("two_sat");
let eval = resolver::evaluation::certify::<_, _, Fnv1aHasher16>(&input).expect("eval");
assert_ne!(
canon.certificate().content_fingerprint(),
twosat.certificate().content_fingerprint(),
);
assert_ne!(
canon.certificate().content_fingerprint(),
eval.certificate().content_fingerprint(),
);
}
#[test]
fn completeness_differs_from_homotopy_same_nerve() {
let input = validated_runtime(ConstrainedTypeInput::default());
let comp = resolver::completeness::certify::<_, _, Fnv1aHasher16>(&input).expect("comp");
let homo = resolver::homotopy::certify::<_, _, Fnv1aHasher16>(&input).expect("homo");
assert_ne!(
comp.certificate().content_fingerprint(),
homo.certificate().content_fingerprint(),
"completeness folds Euler χ in addition to Betti; homotopy folds only Betti — \
their composition differs so fingerprints must differ"
);
}
#[test]
fn type_synthesis_differs_from_homotopy() {
let input = validated_runtime(ConstrainedTypeInput::default());
let ts = resolver::type_synthesis::certify::<_, _, Fnv1aHasher16>(&input).expect("ts");
let homo = resolver::homotopy::certify::<_, _, Fnv1aHasher16>(&input).expect("homo");
assert_ne!(
ts.certificate().content_fingerprint(),
homo.certificate().content_fingerprint(),
);
}