void Molecule::removeBond(unsigned long id) { if (id < m_bonds.size()) { Q_D(Molecule); if (m_bonds[id] == 0) return; d->invalidRings = true; m_invalidPartialCharges = true; m_invalidAromaticity = true; Bond *bond = m_bonds[id]; m_bonds[id] = 0; // Delete the bond from the list and reorder the remaining bonds int index = bond->index(); m_bondList.removeAt(index); for (int i = index; i < m_bondList.size(); ++i) { m_bondList[i]->setIndex(i); } // Also delete the bond from the attached atoms if (m_atoms.size() > bond->beginAtomId()) { if (m_atoms[bond->beginAtomId()]) m_atoms[bond->beginAtomId()]->removeBond(id); } if (m_atoms.size() > bond->endAtomId()) { if (m_atoms[bond->endAtomId()]) m_atoms[bond->endAtomId()]->removeBond(id); } disconnect(bond, SIGNAL(updated()), this, SLOT(updateBond())); emit bondRemoved(bond); bond->deleteLater(); } }
TEST_F(MoleculeTest, addBond) { Molecule molecule; EXPECT_EQ(molecule.bondCount(), static_cast<Index>(0)); Atom a = molecule.addAtom(1); Atom b = molecule.addAtom(1); Bond bondAB = molecule.addBond(a, b); EXPECT_TRUE(bondAB.isValid()); EXPECT_EQ(bondAB.molecule(), &molecule); EXPECT_EQ(molecule.bondCount(), static_cast<Index>(1)); EXPECT_EQ(bondAB.index(), static_cast<Index>(0)); EXPECT_EQ(bondAB.atom1().index(), a.index()); EXPECT_EQ(bondAB.atom2().index(), b.index()); EXPECT_EQ(bondAB.order(), static_cast<unsigned char>(1)); Atom c = molecule.addAtom(1); Bond bondBC = molecule.addBond(b, c, 2); EXPECT_TRUE(bondBC.isValid()); EXPECT_EQ(molecule.bondCount(), static_cast<Index>(2)); EXPECT_EQ(bondBC.index(), static_cast<Index>(1)); EXPECT_EQ(bondBC.order(), static_cast<unsigned char>(2)); // try to lookup nonexistant bond Bond bond = molecule.bond(a, c); EXPECT_FALSE(bond.isValid()); // try to lookup bond between a and b bond = molecule.bond(a, b); EXPECT_TRUE(bond.isValid()); EXPECT_EQ(bond.molecule(), &molecule); EXPECT_EQ(bond.atom1().index(), a.index()); EXPECT_EQ(bond.atom2().index(), b.index()); // try to lookup bond between b and c by index bond = molecule.bond(1); EXPECT_TRUE(bond.isValid()); EXPECT_EQ(bond.molecule(), &molecule); EXPECT_EQ(bond.atom1().index(), b.index()); EXPECT_EQ(bond.atom2().index(), c.index()); }
TEST_F(MoleculeTest, findBond) { Molecule molecule; Atom a1 = molecule.addAtom(5); Atom a2 = molecule.addAtom(6); Bond b = molecule.addBond(a1, a2, 1); EXPECT_EQ(molecule.bond(a1, a2).index(), b.index()); EXPECT_EQ(molecule.bond(a2, a1).index(), b.index()); Array<Bond> bonds = molecule.bonds(a1); EXPECT_EQ(bonds.size(), 1); Atom a3 = molecule.addAtom(7); molecule.addBond(a1, a3, 1); EXPECT_EQ(molecule.bonds(a1).size(), 2); EXPECT_EQ(molecule.bonds(a3).size(), 1); }