runmat-meshing-core 0.6.0

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

#[test]
fn accepts_minimal_valid_tetrahedron4_mesh() {
    let mesh = valid_tetrahedron_mesh();
    validate_analysis_mesh(&mesh, QualityThresholds::default()).expect("mesh should validate");
}

#[test]
fn validation_options_round_trip_with_required_regions() {
    let options = AnalysisMeshValidationOptions {
        required_boundary_region_ids: vec!["fixed".to_string(), "loaded".to_string()],
        required_material_region_ids: vec!["solid".to_string()],
        max_volume_element_count: Some(42),
        coverage_sample_points_m: vec![[0.25, 0.25, 0.25]],
        min_coverage_sample_ratio: 0.75,
        require_no_unrecovered_tetrahedron_components: true,
        ..AnalysisMeshValidationOptions::default()
    };

    let encoded = serde_json::to_value(&options).expect("validation options should serialize");
    let decoded: AnalysisMeshValidationOptions =
        serde_json::from_value(encoded).expect("validation options should deserialize");

    assert_eq!(decoded, options);
}

#[test]
fn rejects_empty_volume_elements() {
    let mut mesh = valid_tetrahedron_mesh();
    mesh.volume_elements.clear();
    let err = validate_analysis_mesh(&mesh, QualityThresholds::default())
        .expect_err("empty volume elements should fail");
    assert_eq!(err, AnalysisMeshValidationError::EmptyVolumeElements);
}

#[test]
fn rejects_mesh_that_exceeds_element_budget() {
    let mesh = valid_tetrahedron_mesh();
    let err = validate_analysis_mesh_with_options(
        &mesh,
        AnalysisMeshValidationOptions {
            max_volume_element_count: Some(0),
            ..AnalysisMeshValidationOptions::default()
        },
    )
    .expect_err("element budget overrun should fail");
    assert_eq!(
        err,
        AnalysisMeshValidationError::ElementBudgetExceeded {
            element_count: 1,
            max_element_count: 0,
        }
    );
}