use opensmiles::{parse, BondType};
#[test]
fn parse_cyclopropane() {
let molecule = parse("C1CC1").expect("Failed to parse cyclopropane");
assert_eq!(molecule.nodes().len(), 3);
assert_eq!(molecule.bonds().len(), 3);
let closing_bond = molecule
.bonds()
.iter()
.find(|b| (b.source() == 0 && b.target() == 2) || (b.source() == 2 && b.target() == 0));
assert!(closing_bond.is_some(), "Should have a closing bond");
}
#[test]
fn parse_cyclobutane() {
let molecule = parse("C1CCC1").expect("Failed to parse cyclobutane");
assert_eq!(molecule.nodes().len(), 4);
assert_eq!(molecule.bonds().len(), 4);
}
#[test]
fn parse_cyclopentane() {
let molecule = parse("C1CCCC1").expect("Failed to parse cyclopentane");
assert_eq!(molecule.nodes().len(), 5);
assert_eq!(molecule.bonds().len(), 5);
}
#[test]
fn parse_cyclohexane() {
let molecule = parse("C1CCCCC1").expect("Failed to parse cyclohexane");
assert_eq!(molecule.nodes().len(), 6);
assert_eq!(molecule.bonds().len(), 6);
for node in molecule.nodes() {
assert_eq!(node.hydrogens(), 2);
}
}
#[test]
fn parse_cyclohexene() {
let molecule = parse("C1=CCCCC1").expect("Failed to parse cyclohexene");
assert_eq!(molecule.nodes().len(), 6);
assert_eq!(molecule.bonds().len(), 6);
let double_bonds: Vec<_> = molecule
.bonds()
.iter()
.filter(|b| b.kind() == BondType::Double)
.collect();
assert_eq!(double_bonds.len(), 1);
}
#[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!(node.aromatic());
}
for bond in molecule.bonds() {
assert_eq!(bond.kind(), BondType::Aromatic);
}
}
#[test]
fn parse_multiple_ring_closures() {
let molecule = parse("C12CC1CC2").expect("Failed to parse spiro compound");
assert_eq!(molecule.nodes().len(), 5);
assert_eq!(molecule.bonds().len(), 6);
}
#[test]
fn parse_fused_rings() {
let molecule = parse("C1CCC2CCCCC2C1").expect("Failed to parse decalin");
assert_eq!(molecule.nodes().len(), 10);
assert_eq!(molecule.bonds().len(), 11);
}
#[test]
fn parse_ring_with_branch() {
let molecule = parse("C1CC(C)CC1").expect("Failed to parse methylcyclopentane");
assert_eq!(molecule.nodes().len(), 6);
assert_eq!(molecule.bonds().len(), 6); }
#[test]
fn parse_two_digit_ring() {
let molecule = parse("C%10CCCCCCCCC%10").expect("Failed to parse cyclodecane");
assert_eq!(molecule.nodes().len(), 10);
assert_eq!(molecule.bonds().len(), 10);
}
#[test]
fn parse_multiple_two_digit_rings() {
let molecule =
parse("C%10%11CC%10CC%11").expect("Failed to parse molecule with multiple ring closures");
assert!(molecule.bonds().len() >= 4);
}
#[test]
fn parse_naphthalene() {
let molecule = parse("c1ccc2ccccc2c1").expect("Failed to parse naphthalene");
assert_eq!(molecule.nodes().len(), 10);
assert_eq!(molecule.bonds().len(), 11);
for node in molecule.nodes() {
assert!(node.aromatic());
}
}
#[test]
fn parse_cyclopropene() {
let molecule = parse("C1=CC1").expect("Failed to parse cyclopropene");
assert_eq!(molecule.nodes().len(), 3);
assert_eq!(molecule.bonds().len(), 3);
let double_bonds: Vec<_> = molecule
.bonds()
.iter()
.filter(|b| b.kind() == BondType::Double)
.collect();
assert_eq!(double_bonds.len(), 1);
}
#[test]
fn parse_cubane() {
let molecule = parse("C12C3C4C1C5C4C3C25").expect("Failed to parse cubane");
assert_eq!(molecule.nodes().len(), 8); assert_eq!(molecule.bonds().len(), 12); }
#[test]
fn parse_ring_inside_branch() {
let molecule = parse("CC(c1ccccc1)").expect("Failed to parse CC(c1ccccc1)");
assert_eq!(molecule.nodes().len(), 8, "C, C, c×6");
assert_eq!(molecule.bonds().len(), 8);
let ring_close = molecule
.bonds()
.iter()
.find(|b| (b.source() == 2 && b.target() == 7) || (b.source() == 7 && b.target() == 2));
assert!(
ring_close.is_some(),
"Ring closure bond 2-7 not found; actual bonds: {:?}",
molecule.bonds()
);
}
#[test]
fn parse_ring_label_gt1_inside_branch() {
let molecule = parse("CC(c2ccccc2)").expect("Failed to parse CC(c2ccccc2)");
assert_eq!(molecule.nodes().len(), 8);
assert_eq!(molecule.bonds().len(), 8);
let ring_close = molecule
.bonds()
.iter()
.find(|b| (b.source() == 2 && b.target() == 7) || (b.source() == 7 && b.target() == 2));
assert!(ring_close.is_some(), "Ring closure bond 2-7 not found");
}
#[test]
fn parse_multiple_rings_in_branches() {
let molecule =
parse("CC(c1ccccc1)CC(c2ccccc2)").expect("Failed to parse CC(c1ccccc1)CC(c2ccccc2)");
assert_eq!(molecule.nodes().len(), 16, "4 aliphatic C + 2×6 aromatic C");
assert_eq!(molecule.bonds().len(), 17);
}