cadmpeg-ir 0.6.2

CAD data model, validation, diffing, and codec API for cadmpeg.
#[test]
fn per_edge_flange_widths_remain_positive_through_mutation_and_serde() {
    use crate::{
        features::{SheetMetalFlangeEdgeWidths, SheetMetalFlangeTwoSidedWidth},
        scalar::PositiveLength,
    };

    let mut widths = SheetMetalFlangeEdgeWidths::new(vec![SheetMetalFlangeTwoSidedWidth {
        first: PositiveLength::new(3.0).unwrap(),
        second: PositiveLength::new(1.5).unwrap(),
    }])
    .unwrap();
    widths.as_mut_slice()[0].first = PositiveLength::new(4.0).unwrap();
    widths.as_mut_slice()[0].second = PositiveLength::new(2.0).unwrap();
    let wire = serde_json::json!([{"first": 4.0, "second": 2.0}]);
    assert_eq!(serde_json::to_value(&widths).unwrap(), wire);
    assert_eq!(
        serde_json::from_value::<SheetMetalFlangeEdgeWidths>(wire.clone()).unwrap(),
        widths
    );
    for field in ["first", "second"] {
        for invalid in [-3.0, 0.0, f64::NAN, f64::INFINITY, f64::NEG_INFINITY] {
            assert!(PositiveLength::new(invalid).is_none());
            let mut invalid_wire = wire.clone();
            invalid_wire[0][field] = serde_json::json!(invalid);
            assert!(
                serde_json::from_value::<SheetMetalFlangeEdgeWidths>(invalid_wire)
                    .unwrap_err()
                    .to_string()
                    .contains(field)
            );
        }
    }
}