def testSubgraphIsomorphism(self): # Simple test comparing C-C to C-C-C (no hydrogens) mol = Molecule() c1 = Atom(getElement(6)) c2 = c1.copy() mol.addAtom(c1) mol.addAtom(c2) mol.addBond(Bond(c1, c2)) mol2 = Molecule() c1 = c1.copy() c2 = c1.copy() c3 = c1.copy() mol2.addAtom(c1) mol2.addAtom(c2) mol2.addAtom(c3) mol2.addBond(Bond(c1, c2)) mol2.addBond(Bond(c2, c3)) self.assertTrue(self.vf3.isSubgraphIsomorphic(mol2, mol, None)) self.assertFalse(self.vf3.isSubgraphIsomorphic(mol, mol2, None)) # Ring membership is a semantic property of molecules, # so straight chains are not considered sub graphs of rings hexane = Molecule().fromSMILES("C1CCCCC1") self.assertFalse(self.vf3.isSubgraphIsomorphic(hexane, mol, None)) self.assertFalse(self.vf3.isSubgraphIsomorphic(hexane, mol2, None)) # Benzene and hexane, while technically sharing the same shape, # differ in semantic information. benzene = Molecule().fromSMILES("C1=CC=CC=C1") self.assertFalse(self.vf3.isSubgraphIsomorphic(hexane, benzene, None)) # Test sub graph isomorphism on rings hexaneMinusH = hexane.copy(True) hexaneMinusH.removeVertex(hexaneMinusH.vertices[6]) self.assertTrue(self.vf3.isSubgraphIsomorphic(hexane, hexaneMinusH, None)) self.assertFalse(self.vf3.isSubgraphIsomorphic(hexaneMinusH, hexane, None)) benzeneMinusH = benzene.copy(True) benzeneMinusH.removeVertex(benzeneMinusH.vertices[6]) self.assertTrue(self.vf3.isSubgraphIsomorphic(benzene, benzeneMinusH, None)) self.assertFalse(self.vf3.isSubgraphIsomorphic(benzeneMinusH, hexane, None))
def testApplyActionLoseRadical(self): """ Test the Atom.applyAction() method for a LOSE_RADICAL action. """ action = ['LOSE_RADICAL', '*1', 1] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons + 1) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label)
def testApplyActionDecrementBond(self): """ Test the Atom.applyAction() method for a CHANGE_BOND action. """ action = ['CHANGE_BOND', '*1', -1, '*2'] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label)
class TestAtom(unittest.TestCase): """ Contains unit tests of the Atom class. """ def setUp(self): """ A method called before each unit test in this class. """ self.atom = Atom(element=getElement('C'), radicalElectrons=1, charge=0, label='*1', lonePairs=0) def testMass(self): """ Test the Atom.mass property. """ self.assertTrue(self.atom.mass == self.atom.element.mass) def testNumber(self): """ Test the Atom.number property. """ self.assertTrue(self.atom.number == self.atom.element.number) def testSymbol(self): """ Test the Atom.symbol property. """ self.assertTrue(self.atom.symbol == self.atom.element.symbol) def testIsHydrogen(self): """ Test the Atom.isHydrogen() method. """ for element in elementList: atom = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) if element.symbol == 'H': self.assertTrue(atom.isHydrogen()) else: self.assertFalse(atom.isHydrogen()) def testIsNonHydrogen(self): """ Test the Atom.isNonHydrogen() method. """ for element in elementList: atom = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) if element.symbol == 'H': self.assertFalse(atom.isNonHydrogen()) else: self.assertTrue(atom.isNonHydrogen()) def testIsCarbon(self): """ Test the Atom.isCarbon() method. """ for element in elementList: atom = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) if element.symbol == 'C': self.assertTrue(atom.isCarbon()) else: self.assertFalse(atom.isCarbon()) def testIsOxygen(self): """ Test the Atom.isOxygen() method. """ for element in elementList: atom = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=2) if element.symbol == 'O': self.assertTrue(atom.isOxygen()) else: self.assertFalse(atom.isOxygen()) def testIncrementRadical(self): """ Test the Atom.incrementRadical() method. """ radicalElectrons = self.atom.radicalElectrons self.atom.incrementRadical() self.assertEqual(self.atom.radicalElectrons, radicalElectrons + 1) def testDecrementRadical(self): """ Test the Atom.decrementRadical() method. """ radicalElectrons = self.atom.radicalElectrons self.atom.decrementRadical() self.assertEqual(self.atom.radicalElectrons, radicalElectrons - 1) def testApplyActionBreakBond(self): """ Test the Atom.applyAction() method for a BREAK_BOND action. """ action = ['BREAK_BOND', '*1', 'S', '*2'] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label) def testApplyActionFormBond(self): """ Test the Atom.applyAction() method for a FORM_BOND action. """ action = ['FORM_BOND', '*1', 'S', '*2'] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label) def testApplyActionIncrementBond(self): """ Test the Atom.applyAction() method for a CHANGE_BOND action. """ action = ['CHANGE_BOND', '*1', 1, '*2'] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label) def testApplyActionDecrementBond(self): """ Test the Atom.applyAction() method for a CHANGE_BOND action. """ action = ['CHANGE_BOND', '*1', -1, '*2'] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label) def testApplyActionGainRadical(self): """ Test the Atom.applyAction() method for a GAIN_RADICAL action. """ action = ['GAIN_RADICAL', '*1', 1] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons - 1) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label) def testApplyActionLoseRadical(self): """ Test the Atom.applyAction() method for a LOSE_RADICAL action. """ action = ['LOSE_RADICAL', '*1', 1] for element in elementList: atom0 = Atom(element=element, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom = atom0.copy() atom.applyAction(action) self.assertEqual(atom0.element, atom.element) self.assertEqual(atom0.radicalElectrons, atom.radicalElectrons + 1) self.assertEqual(atom0.charge, atom.charge) self.assertEqual(atom0.label, atom.label) def testEquivalent(self): """ Test the Atom.equivalent() method. """ for index1, element1 in enumerate(elementList[0:10]): for index2, element2 in enumerate(elementList[0:10]): atom1 = Atom(element=element1, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom2 = Atom(element=element2, radicalElectrons=1, charge=0, label='*1', lonePairs=0) if index1 == index2: self.assertTrue(atom1.equivalent(atom2)) self.assertTrue(atom2.equivalent(atom1)) else: self.assertFalse(atom1.equivalent(atom2)) self.assertFalse(atom2.equivalent(atom1)) def testIsSpecificCaseOf(self): """ Test the Atom.isSpecificCaseOf() method. """ for index1, element1 in enumerate(elementList[0:10]): for index2, element2 in enumerate(elementList[0:10]): atom1 = Atom(element=element1, radicalElectrons=1, charge=0, label='*1', lonePairs=0) atom2 = Atom(element=element2, radicalElectrons=1, charge=0, label='*1', lonePairs=0) if index1 == index2: self.assertTrue(atom1.isSpecificCaseOf(atom2)) else: self.assertFalse(atom1.isSpecificCaseOf(atom2)) def testCopy(self): """ Test the Atom.copy() method. """ atom = self.atom.copy() self.assertEqual(self.atom.element.symbol, atom.element.symbol) self.assertEqual(self.atom.atomType, atom.atomType) self.assertEqual(self.atom.radicalElectrons, atom.radicalElectrons) self.assertEqual(self.atom.charge, atom.charge) self.assertEqual(self.atom.label, atom.label) def testPickle(self): """ Test that a Atom object can be successfully pickled and unpickled with no loss of information. """ import cPickle atom = cPickle.loads(cPickle.dumps(self.atom)) self.assertEqual(self.atom.element.symbol, atom.element.symbol) self.assertEqual(self.atom.atomType, atom.atomType) self.assertEqual(self.atom.radicalElectrons, atom.radicalElectrons) self.assertEqual(self.atom.charge, atom.charge) self.assertEqual(self.atom.label, atom.label)