smiles-rs 0.1.3

A SMILES parser producing molecular graphs, with no_std support
Documentation
use alloc::vec::Vec;

use super::super::{Smiles, canonicalization_state_key};

#[track_caller]
fn assert_distinct_canonicalization_state(left: &Smiles, right: &Smiles) {
    assert_ne!(
        canonicalization_state_key(left),
        canonicalization_state_key(right),
        "canonicalization state unexpectedly converged"
    );
}

#[test]
fn canonicalize_converges_source_backed_square_planar_groups() {
    let cis_group = [
        "[NH3][Pt@SP1]([NH3])(Cl)Cl",
        "[NH3][Pt@SP3]([NH3])(Cl)Cl",
        "[NH3][Pt@SP2](Cl)([NH3])Cl",
        "[NH3][Pt@SP1](Cl)(Cl)[NH3]",
    ];
    let trans_group =
        ["[NH3][Pt@SP2]([NH3])(Cl)Cl", "[NH3][Pt@SP1](Cl)([NH3])Cl", "[NH3][Pt@SP3](Cl)(Cl)[NH3]"];

    let cis_canonicalized = cis_group
        .iter()
        .map(|source| Smiles::from_str(source).unwrap().canonicalize())
        .collect::<Vec<_>>();
    for other in &cis_canonicalized[1..] {
        assert_eq!(&cis_canonicalized[0], other);
    }

    let trans_canonicalized = trans_group
        .iter()
        .map(|source| Smiles::from_str(source).unwrap().canonicalize())
        .collect::<Vec<_>>();
    for other in &trans_canonicalized[1..] {
        assert_eq!(&trans_canonicalized[0], other);
    }

    assert_distinct_canonicalization_state(&cis_canonicalized[0], &trans_canonicalized[0]);
}

#[test]
fn canonicalize_preserves_non_tetrahedral_stereo_distinctions() {
    let sp1 = Smiles::from_str("F[Po@SP1](Cl)(Br)I").unwrap().canonicalize();
    let sp2 = Smiles::from_str("F[Po@SP2](Cl)(Br)I").unwrap().canonicalize();
    let sp3 = Smiles::from_str("F[Po@SP3](Cl)(Br)I").unwrap().canonicalize();

    let tb1 = Smiles::from_str("S[As@TB1](F)(Cl)(Br)N").unwrap().canonicalize();
    let tb2 = Smiles::from_str("S[As@TB2](F)(Cl)(Br)N").unwrap().canonicalize();

    let oh1 = Smiles::from_str("C[Co@OH1](F)(Cl)(Br)(I)S").unwrap().canonicalize();
    let oh2 = Smiles::from_str("C[Co@OH2](F)(Cl)(Br)(I)S").unwrap().canonicalize();

    assert_distinct_canonicalization_state(&sp1, &sp2);
    assert_distinct_canonicalization_state(&sp1, &sp3);
    assert_distinct_canonicalization_state(&sp2, &sp3);
    assert_distinct_canonicalization_state(&tb1, &tb2);
    assert_distinct_canonicalization_state(&oh1, &oh2);
}