use opensmiles::{parse, AtomSymbol, BondType, OrganicAtom};
#[test]
fn parse_aromatic_carbon() {
let molecule = parse("c").expect("Failed to parse aromatic carbon");
assert_eq!(molecule.nodes().len(), 1);
assert!(molecule.nodes()[0].aromatic());
assert_eq!(
*molecule.nodes()[0].atom().element(),
AtomSymbol::Organic(OrganicAtom::C)
);
}
#[test]
fn parse_aromatic_nitrogen() {
let molecule = parse("n").expect("Failed to parse aromatic nitrogen");
assert!(molecule.nodes()[0].aromatic());
assert_eq!(
*molecule.nodes()[0].atom().element(),
AtomSymbol::Organic(OrganicAtom::N)
);
}
#[test]
fn parse_aromatic_oxygen() {
let molecule = parse("o").expect("Failed to parse aromatic oxygen");
assert!(molecule.nodes()[0].aromatic());
assert_eq!(
*molecule.nodes()[0].atom().element(),
AtomSymbol::Organic(OrganicAtom::O)
);
}
#[test]
fn parse_aromatic_sulfur() {
let molecule = parse("s").expect("Failed to parse aromatic sulfur");
assert!(molecule.nodes()[0].aromatic());
assert_eq!(
*molecule.nodes()[0].atom().element(),
AtomSymbol::Organic(OrganicAtom::S)
);
}
#[test]
fn parse_benzene() {
let molecule = parse("c1ccccc1").expect("Failed to parse benzene");
assert_eq!(molecule.nodes().len(), 6);
assert_eq!(molecule.bonds().len(), 6);
for node in molecule.nodes() {
assert_eq!(*node.atom().element(), AtomSymbol::Organic(OrganicAtom::C));
assert_eq!(node.atom().charge(), 0);
assert_eq!(node.atom().isotope(), None);
assert!(node.aromatic());
assert_eq!(node.class(), None);
assert_eq!(node.hydrogens(), 1); }
for bond in molecule.bonds() {
assert_eq!(bond.kind(), BondType::Aromatic);
}
}
#[test]
fn parse_pyridine() {
let molecule = parse("c1ccncc1").expect("Failed to parse pyridine");
assert_eq!(molecule.nodes().len(), 6);
assert_eq!(molecule.bonds().len(), 6);
let carbons: Vec<_> = molecule
.nodes()
.iter()
.filter(|n| *n.atom().element() == AtomSymbol::Organic(OrganicAtom::C))
.collect();
let nitrogens: Vec<_> = molecule
.nodes()
.iter()
.filter(|n| *n.atom().element() == AtomSymbol::Organic(OrganicAtom::N))
.collect();
assert_eq!(carbons.len(), 5);
assert_eq!(nitrogens.len(), 1);
for node in molecule.nodes() {
assert!(node.aromatic());
}
}
#[test]
fn parse_furan() {
let molecule = parse("c1ccoc1").expect("Failed to parse furan");
assert_eq!(molecule.nodes().len(), 5);
assert_eq!(molecule.bonds().len(), 5);
let oxygen = molecule
.nodes()
.iter()
.find(|n| *n.atom().element() == AtomSymbol::Organic(OrganicAtom::O));
assert!(oxygen.is_some());
assert!(oxygen.unwrap().aromatic());
}
#[test]
fn parse_thiophene() {
let molecule = parse("c1ccsc1").expect("Failed to parse thiophene");
assert_eq!(molecule.nodes().len(), 5);
let sulfur = molecule
.nodes()
.iter()
.find(|n| *n.atom().element() == AtomSymbol::Organic(OrganicAtom::S));
assert!(sulfur.is_some());
assert!(sulfur.unwrap().aromatic());
}
#[test]
fn parse_pyrrole() {
let molecule = parse("c1cc[nH]c1").expect("Failed to parse pyrrole");
assert_eq!(molecule.nodes().len(), 5);
assert_eq!(molecule.bonds().len(), 5);
let nitrogen = molecule
.nodes()
.iter()
.find(|n| *n.atom().element() == AtomSymbol::Organic(OrganicAtom::N));
assert!(nitrogen.is_some());
assert_eq!(nitrogen.unwrap().hydrogens(), 1);
}
#[test]
fn parse_imidazole() {
let molecule = parse("c1cnc[nH]1").expect("Failed to parse imidazole");
assert_eq!(molecule.nodes().len(), 5);
let nitrogens: Vec<_> = molecule
.nodes()
.iter()
.filter(|n| *n.atom().element() == AtomSymbol::Organic(OrganicAtom::N))
.collect();
assert_eq!(nitrogens.len(), 2);
}
#[test]
fn parse_indole() {
let molecule = parse("c1ccc2[nH]ccc2c1").expect("Failed to parse indole");
assert_eq!(molecule.nodes().len(), 9);
assert_eq!(molecule.bonds().len(), 10);
}
#[test]
fn parse_mixed_aromatic_aliphatic() {
let molecule = parse("Cc1ccccc1").expect("Failed to parse toluene");
assert_eq!(molecule.nodes().len(), 7);
assert!(!molecule.nodes()[0].aromatic());
for i in 1..7 {
assert!(molecule.nodes()[i].aromatic());
}
}
#[test]
fn parse_biphenyl() {
let molecule = parse("c1ccccc1-c2ccccc2").expect("Failed to parse biphenyl");
assert_eq!(molecule.nodes().len(), 12);
assert_eq!(molecule.bonds().len(), 13);
for node in molecule.nodes() {
assert!(node.aromatic());
}
let aromatic_bonds = molecule
.bonds()
.iter()
.filter(|b| b.kind() == BondType::Aromatic)
.count();
let simple_bonds = molecule
.bonds()
.iter()
.filter(|b| b.kind() == BondType::Simple)
.count();
assert_eq!(aromatic_bonds, 12);
assert_eq!(
simple_bonds, 1,
"The bond between the two benzenes must be simple, not aromatic"
);
}