runmat-meshing-core 0.6.0

Deterministic meshing preparation contracts for RunMat
Documentation
use super::*;

#[test]
fn rejects_boundary_leak_status_count_that_does_not_match_attempts() {
    let mut mesh = valid_tetrahedron_mesh();
    mesh.backend
        .tetrahedron_attempted_boundary_leak_recovery_item_count = 2;
    mesh.backend.tetrahedron_exposed_interior_source_face_count = 1;

    let err = validate_analysis_mesh(&mesh, Default::default())
        .expect_err("boundary-leak outcomes must account for every attempted source face");

    assert_eq!(
        err,
        AnalysisMeshValidationError::InconsistentTetrahedronRecoveryAggregateEvidence {
            family: "boundary_leak_status_items".to_string(),
            aggregate_count: 2,
            typed_count: 1,
        }
    );
}

#[test]
fn rejects_boundary_leak_rejection_reason_count_that_does_not_match_rejections() {
    let mut mesh = valid_tetrahedron_mesh();
    mesh.backend
        .tetrahedron_attempted_boundary_leak_recovery_item_count = 2;
    mesh.backend.tetrahedron_exposed_interior_source_face_count = 1;
    mesh.backend
        .tetrahedron_rejected_boundary_leak_recovery_item_count = 1;

    let err = validate_analysis_mesh(&mesh, Default::default())
        .expect_err("boundary-leak rejection reasons must match rejected source faces");

    assert_eq!(
        err,
        AnalysisMeshValidationError::InconsistentTetrahedronRecoveryAggregateEvidence {
            family: "boundary_leak_rejection_reason_items".to_string(),
            aggregate_count: 1,
            typed_count: 0,
        }
    );
}