use opensmiles::{parse, AtomSymbol, OrganicAtom};
#[test]
fn parse_disconnected_simple() {
let molecule = parse("C.C").expect("Failed to parse C.C");
assert_eq!(molecule.nodes().len(), 2);
assert_eq!(molecule.bonds().len(), 0); }
#[test]
fn parse_disconnected_ionic() {
let molecule = parse("[Na+].[Cl-]").expect("Failed to parse NaCl");
assert_eq!(molecule.nodes().len(), 2);
assert_eq!(molecule.bonds().len(), 0);
assert_eq!(*molecule.nodes()[0].atom().element(), AtomSymbol::Na);
assert_eq!(molecule.nodes()[0].atom().charge(), 1);
assert_eq!(
*molecule.nodes()[1].atom().element(),
AtomSymbol::Organic(OrganicAtom::Cl)
);
assert_eq!(molecule.nodes()[1].atom().charge(), -1);
}
#[test]
fn parse_disconnected_multiple() {
let molecule = parse("C.C.C").expect("Failed to parse C.C.C");
assert_eq!(molecule.nodes().len(), 3);
assert_eq!(molecule.bonds().len(), 0);
}
#[test]
fn parse_disconnected_complex() {
let molecule = parse("CC.CC").expect("Failed to parse CC.CC");
assert_eq!(molecule.nodes().len(), 4);
assert_eq!(molecule.bonds().len(), 2);
let bond0 = &molecule.bonds()[0];
let bond1 = &molecule.bonds()[1];
assert_eq!(bond0.source(), 0);
assert_eq!(bond0.target(), 1);
assert_eq!(bond1.source(), 2);
assert_eq!(bond1.target(), 3);
}
#[test]
fn parse_disconnected_with_branches() {
let molecule = parse("CC(C)C.CC").expect("Failed to parse CC(C)C.CC");
assert_eq!(molecule.nodes().len(), 6);
assert_eq!(molecule.bonds().len(), 4); }
#[test]
fn parse_water_hydronium() {
let molecule = parse("[OH2].[H+]").expect("Failed to parse water + hydronium");
assert_eq!(molecule.nodes().len(), 2);
assert_eq!(molecule.bonds().len(), 0);
assert_eq!(
*molecule.nodes()[0].atom().element(),
AtomSymbol::Organic(OrganicAtom::O)
);
assert_eq!(molecule.nodes()[0].hydrogens(), 2);
assert_eq!(*molecule.nodes()[1].atom().element(), AtomSymbol::H);
assert_eq!(molecule.nodes()[1].atom().charge(), 1);
}
#[test]
fn parse_hydrate() {
let molecule = parse("CCO.[OH2]").expect("Failed to parse ethanol hydrate");
assert_eq!(molecule.nodes().len(), 4); assert_eq!(molecule.bonds().len(), 2); }
#[test]
fn parse_metal_complex() {
let molecule = parse("[Cu+2].[O-].[O-]").expect("Failed to parse copper oxide");
assert_eq!(molecule.nodes().len(), 3);
assert_eq!(molecule.bonds().len(), 0);
assert_eq!(*molecule.nodes()[0].atom().element(), AtomSymbol::Cu);
assert_eq!(molecule.nodes()[0].atom().charge(), 2);
for i in 1..=2 {
assert_eq!(
*molecule.nodes()[i].atom().element(),
AtomSymbol::Organic(OrganicAtom::O)
);
assert_eq!(molecule.nodes()[i].atom().charge(), -1);
}
}