molgfx-core 0.2.1

The semantic scene graph: columnar tables, GPU record layouts, the borrowed coordinate seam.
Documentation
use super::*;

#[test]
fn calibrated_fields_require_quantity_units_and_provenance() {
    let valid = ScalarFieldSemantics::quantity(
        Arc::from("electrostatic potential"),
        Arc::from("kT/e"),
        Arc::from("molframe:apbs-run-42"),
    );
    assert!(valid.is_ok());
    let invalid = ScalarFieldSemantics::quantity(
        Arc::from("electrostatic potential"),
        Arc::from(" "),
        Arc::from("molframe:apbs-run-42"),
    );
    assert!(invalid.is_err());
}

#[test]
fn scalar_ramps_expose_the_exact_reversible_legend_stops() {
    let values = [-5.0, 0.0, 5.0];
    let colors = [
        Rgba8::opaque(0, 0, 255),
        Rgba8::WHITE,
        Rgba8::opaque(255, 0, 0),
    ];
    let ramp = match ScalarRamp::new(values, colors) {
        Ok(ramp) => ramp,
        Err(error) => panic!("ramp validates: {error}"),
    };
    for (actual, expected) in ramp.values().into_iter().zip(values) {
        assert!((actual - expected).abs() < f32::EPSILON);
    }
    assert_eq!(ramp.colors(), colors);
}

#[test]
fn sequential_ramps_sample_endpoints_midpoint_and_missing_values() {
    let missing = Rgba8::opaque(112, 112, 112);
    let ramp = ScalarRamp::sequential([10.0, 30.0]);
    let colors = ramp.colors();
    assert_eq!(ramp.sample(-1.0, missing), colors[0]);
    assert_eq!(ramp.sample(20.0, missing), colors[1]);
    assert_eq!(ramp.sample(300.0, missing), colors[2]);
    assert_eq!(ramp.sample(f32::NAN, missing), missing);
}

#[test]
fn contour_intervals_cannot_collapse_to_a_feature_toggle() {
    assert!(ScalarContours::new(0.5, 1.25).is_ok());
    assert!(ScalarContours::new(0.0, 1.25).is_err());
    assert!(ScalarContours::new(0.5, f32::NAN).is_err());
}