extern crate yowl;
use std::fs;
use yowl::feature::{Aliphatic, AtomKind, BondKind};
use yowl::graph::{Atom, Bond, Builder};
use yowl::read::read;
use yowl::walk::walk;
use yowl::write::Writer;
use pretty_assertions::assert_eq;
macro_rules! roundtrip_smiles {
($smiles:expr) => {{
let mut writer = Writer::default();
let _ = read($smiles, &mut writer, None);
let written_smiles = writer.write();
assert_eq!(written_smiles, $smiles);
}};
}
#[test]
fn it_works() {
let mut builder = Builder::default();
read("CO", &mut builder, None).unwrap();
assert_eq!(
builder.build(),
Ok(vec![
Atom {
kind: AtomKind::Aliphatic(Aliphatic::C),
bonds: vec![Bond::new(BondKind::Elided, 1)]
},
Atom {
kind: AtomKind::Aliphatic(Aliphatic::O),
bonds: vec![Bond::new(BondKind::Elided, 0)]
}
])
);
}
#[test]
fn roundtripping_smiles_strings() {
let all_smiles = [
"CO", "C1=CC=CC=C1", "C[C@H](O)[C@@H](O)C(=O)O", "C1CC1C(=O)O", "[Db][Sg][Bh][Hs][Mt][Ds][Rg][Cn][Nh][Fl][Mc][Lv][Ts][Og]", "O=Cc1ccc(O)c(OC)c1COc1cc(C=O)ccc1O", "CC(=O)NCCC1=CNc2c1cc(OC)cc2CC(=O)NCCc1c[nH]c2ccc(OC)cc12", "CC1=C(C(=O)C[C@@H]1OC(=O)[C@@H]2[C@H](C2(C)C)/C=C(\\C)/C(=O)OC)C/C=C\\C=C", "OC[C@@H](O1)[C@@H](O)[C@H](O)[C@@H]2[C@@H]1c3c(O)c(OC)c(O)cc3C(=O)O2", "CC(=O)OCCC(/C)=C\\C[C@H](C(C)=C)CCC=C", "CC[C@H](O1)CC[C@@]12CCCO2", "OCCc1c(C)[n+](cs1)Cc2cnc(C)nc2N", "[as]", "[b]", "[c]", "[o]", "[s]", "[p]", "c1ccc[se]1", "c1ccc[te]1", "[si]1cccc[si]1", "[Uun][Uuu][Uub][Uut][Uuq][Uup][Uuh][Uus][Uuo]", "[Db][Sg][Bh][Hs][Mt][Ds][Rg][Cn][Nh][Fl][Mc][Lv][Ts][Og]", "C[Fe@TH](O)(Cl)F", "C[Fe@TB](O)(Cl)(Br)F", "C[Fe@SP](O)(Cl)F", "C5CCC(C14CCCC1C2CCCC23CCCC34)C5", ];
for smiles in all_smiles {
roundtrip_smiles!(smiles);
}
}
#[test]
fn bunch_of_smiles() {
let contents =
fs::read_to_string("tests/parsed_smiles.smi").expect("'parse_smiles.smi' available");
for smiles in contents.split_whitespace() {
roundtrip_smiles!(smiles);
}
}