molframe-core 0.6.1

Core types, storage and analysis contracts for molframe
Documentation
use super::*;
use crate::contract::policy::{
    AlignmentPolicy, AltlocPolicy, AssemblyChoice, ContactDefinition, EquivalencePolicy,
    Fingerprint, HydrogenPolicy, MissingPolicy, ModelChoice, Namespace, PeriodicPolicy,
    PolicyField, Precision, ProfileId, RadiiSet, SymmetryPolicy,
};

#[test]
fn the_default_policy_is_a_named_profile_rather_than_an_accident() {
    let policy = AnalysisPolicy::default();
    assert_eq!(policy.profile(), Some(ProfileId::DEFAULT));
    assert_eq!(ProfileId::DEFAULT.as_str(), "molframe-default-1.0");
}

#[test]
fn the_named_profile_holds_the_values_it_is_documented_to_hold() {
    let policy = AnalysisPolicy::default();
    assert_eq!(policy.assembly, AssemblyChoice::AsymmetricUnit);
    assert_eq!(policy.model, ModelChoice::First);
    assert_eq!(policy.altloc, AltlocPolicy::ConformerConsistent);
    assert_eq!(policy.identifiers, Namespace::Auth);
    assert_eq!(policy.missing_atoms, MissingPolicy::Report);
    assert_eq!(policy.hydrogens, HydrogenPolicy::ExplicitOnly);
    assert_eq!(policy.atom_equivalence, EquivalencePolicy::Ccd);
    assert_eq!(policy.symmetry, SymmetryPolicy::None);
    assert_eq!(policy.alignment, AlignmentPolicy::None);
    assert_eq!(policy.precision, Precision::F64);
    assert_eq!(policy.periodic, PeriodicPolicy::None);
    assert_eq!(policy.vdw_radii, RadiiSet::Bondi);
    assert_eq!(
        policy.contact_def,
        ContactDefinition::DistanceCutoff { tolerance: 0.5 }
    );
}

#[test]
fn per_atom_highest_occupancy_is_never_the_default_and_is_marked_hazardous() {
    assert!(!AnalysisPolicy::default().altloc.is_hazardous());
    assert!(AltlocPolicy::HighestOccupancyPerAtom.is_hazardous());
    assert!(!AltlocPolicy::ConformerConsistent.is_hazardous());
}

#[test]
fn a_policy_altered_anywhere_stops_claiming_to_be_the_profile() {
    for altered in [
        AnalysisPolicy::default().with_identifiers(Namespace::Label),
        AnalysisPolicy::default().with_model(ModelChoice::Index(2)),
        AnalysisPolicy::default().with_altloc(AltlocPolicy::First),
        AnalysisPolicy::default().with_missing_atoms(MissingPolicy::Fail),
        AnalysisPolicy::default().with_assembly(AssemblyChoice::Biological("1".into())),
    ] {
        assert_eq!(altered.profile(), None, "{altered:?}");
    }
}

#[test]
fn a_policy_altered_anywhere_fingerprints_differently() {
    let baseline = AnalysisPolicy::default().fingerprint();
    let variants = [
        AnalysisPolicy::default().with_identifiers(Namespace::Explicit),
        AnalysisPolicy::default().with_model(ModelChoice::All),
        AnalysisPolicy::default().with_altloc(AltlocPolicy::HighestOccupancyPerAtom),
        AnalysisPolicy {
            precision: Precision::F32,
            ..AnalysisPolicy::default()
        },
        AnalysisPolicy {
            contact_def: ContactDefinition::SurfaceBased { probe: 1.4 },
            ..AnalysisPolicy::default()
        },
        AnalysisPolicy {
            vdw_radii: RadiiSet::Charmm,
            ..AnalysisPolicy::default()
        },
    ];
    for variant in variants {
        assert_ne!(variant.fingerprint(), baseline, "{variant:?}");
    }
}

#[test]
fn the_same_policy_fingerprints_the_same_way_every_time() {
    let policy = AnalysisPolicy::default().with_identifiers(Namespace::Explicit);
    assert_eq!(policy.fingerprint(), policy.clone().fingerprint());
    assert_eq!(
        AnalysisPolicy::default().fingerprint(),
        AnalysisPolicy::default().fingerprint()
    );
}

#[test]
fn writing_a_policy_names_every_field_so_the_record_is_complete() {
    let written = AnalysisPolicy::default().to_string();
    for field in PolicyField::ALL {
        assert!(
            written.contains(field.name()),
            "{} is missing",
            field.name()
        );
    }
    assert!(written.contains("molframe-default-1.0"));
}

#[test]
fn a_modified_policy_says_so_rather_than_claiming_the_profiles_name() {
    let written = AnalysisPolicy::default()
        .with_identifiers(Namespace::Label)
        .to_string();
    assert!(written.starts_with("(modified from molframe-default-1.0)"));
}

#[test]
fn a_fingerprint_of_bytes_depends_on_the_bytes_and_not_on_the_process() {
    assert_eq!(Fingerprint::of(b"abc"), Fingerprint::of(b"abc"));
    assert_ne!(Fingerprint::of(b"abc"), Fingerprint::of(b"abd"));
    assert!(Fingerprint::of(b"abc").to_string().starts_with("fnv1a64:"));
}