def test_forced_charge2(): """Test forced charge correction with no corresponding proton for neutralization.""" # GitHub Issue #15 assert standardize_smiles('[Na].[Na]') == '[Na+].[Na+]' # TODO: Arguably should become selenite ion... O=[Se]([O-])[O-]. Need an AcidBasePair? assert standardize_smiles( '[Na].[Na].O[Se](O)=O') == 'O=[Se](O)O.[Na+].[Na+]'
def test_should_complete(): """Reionization should not infinitely loop forever on these molecules.""" # GitHub Issue #14 assert standardize_smiles( 'CCCCCCCCCCCCCCCCCC(=O)CC(=C)C(=O)O[Ti](=O)(OC(C)C)C(C)C' ) == 'C=C(CC(=O)[CH-]CCCCCCCCCCCCCCCC)C(=O)[O-].CC(C)[O-].CCC.[O-2].[Ti+5]' assert standardize_smiles( 'OP(=O)(O)[O-].OP(=O)([O-])[O-].[O-]S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Mg+2].[Cl-].[Cl-].[K+].[K+]' ) == 'O=P([O-])(O)O.O=P([O-])([O-])O.O=S(=O)([O-])[O-].[Cl-].[Cl-].[K+].[K+].[Mg+2].[Na+].[Na+].[Na+]'
def test_nitro_normalization3(): """Normalize nitro group.""" eq_(standardize_smiles("[O-][N+](=O)c1ccccc1"), "O=[N+]([O-])c1ccccc1")
def test_disconnect_metal4(): """Leave mercury covalently bonded.""" eq_(standardize_smiles("CC[Hg]SC1=C(C=CC=C1)C(=O)[O][Na]"), "[Na+].CC[Hg]Sc1ccccc1C(=O)[O-]")
def test_stereochemistry(): """Check stereochemistry is correctly perceived.""" eq_(standardize_smiles("Cl\\C=C/Cl"), "Cl/C=C\\Cl")
def test_charge_preservation(): """Unusually charged histidine should be preserved. (See charge parent for normalization).""" eq_(standardize_smiles("[NH3+]C(Cc1cnc[nH]1)C(=O)[O-]"), "[NH3+]C(Cc1cnc[nH]1)C(=O)[O-]")
def test_transform_maintains_ring(): """Ensure no transforms inadvertently breaks open rings.""" eq_(standardize_smiles("[nH]1ccc2cccc[n+]12"), "c1cc2ccccn2[nH+]1")
def test_charge_to_protonated_atom6(): """Shift positive charge from nonprotonated to protonated atom.""" eq_(standardize_smiles("[nH]1ccc(=[N+](C)C)cc1"), "CN(C)c1cc[nH+]cc1")
def test_charge_to_protonated_atom9(): """Shift positive charge from nonprotonated to protonated atom.""" assert standardize_smiles('CNC=CC=[N+](C)C') == 'C[NH+]=CC=CN(C)C'
def test_charge_to_protonated_atom6(): """Shift positive charge from nonprotonated to protonated atom.""" assert standardize_smiles('[nH]1ccc(=[N+](C)C)cc1') == 'CN(C)c1cc[nH+]cc1'
def test_aromaticity3(): """Redo incorrect aromatization.""" assert standardize_smiles('C=Cc1ccc2c(c1)NC(=O)/C/2=C\\c1ccc[nH]1' ) == 'C=Cc1ccc2c(c1)NC(=O)/C2=C\\c1ccc[nH]1' assert standardize_smiles('C=Cc1ccc2c(c1)[nH]c(=O)/c/2=C\\c1ccc[nH]1' ) == 'C=Cc1ccc2c(c1)NC(=O)/C2=C\\c1ccc[nH]1'
def test_1_5_aromatic_charge_recombination2(): """Recombine aromatic 1,5-separated charges.""" assert standardize_smiles('C[n+]1ccc([N-]C)cc1') == 'CN=c1ccn(C)cc1'
def test_1_5_aromatic_charge_recombination(): """Recombine aromatic 1,5-separated charges.""" assert standardize_smiles('[n-]1ccc(=[N+](C)C)cc1') == 'CN(C)c1ccncc1'
def test_1_5_nonaromatic_charge_recombination(): """Recombine non-aromatic 1,5-separated charges.""" assert standardize_smiles('C[N-]C=CC=[N+](C)C') == 'CN=CC=CN(C)C'
def test_pyrimidone_charge_recombination2(): """Recombine aromatic 1,3-separated charges to form pyrimidone.""" assert standardize_smiles( 'COc1cc2ccc3c4c(OC)cc(OC)c(OC)c4c([O-])[n+](C)c3c2cc1OC' ) == 'COc1cc2ccc3c4c(OC)cc(OC)c(OC)c4c(=O)n(C)c3c2cc1OC'
def test_1_5_nonaromatic_charge_recombination(): """Recombine non-aromatic 1,5-separated charges.""" eq_(standardize_smiles("C[N-]C=CC=[N+](C)C"), "CN=CC=CN(C)C")
def test_1_5_aromatic_charge_recombination2(): """Recombine aromatic 1,5-separated charges.""" eq_(standardize_smiles("C[n+]1ccc([N-]C)cc1"), "CN=c1ccn(C)cc1")
def test_transform_maintains_ring(): """Ensure no transforms inadvertently breaks open rings.""" assert standardize_smiles( '[O-]C1=CC=CC2=CC=CC=[N+]12') == 'O=c1cccc2ccccn12'
def test_charge_to_protonated_atom8(): """Shift positive charge from nonprotonated to protonated atom.""" eq_(standardize_smiles("C[n+]1ccc2[nH]ccc2c1"), "Cn1ccc2[nH+]ccc-2c1")
def test_equal_reionize(): """Don't change partially ionized acid with two equally strong acid groups.""" assert standardize_smiles('C1=C(C=CC(=C1)[S]([O-])(=O)=O)[S](O)(=O)=O' ) == 'O=S(=O)([O-])c1ccc(S(=O)(=O)O)cc1'
def test_reionize2(): """Partially ionized acid where proton should be moved to weaker acid.""" eq_(standardize_smiles("C1=C(C=CC(=C1)[P]([O-])(=O)O)[S](O)(=O)=O"), "O=P(O)(O)c1ccc(S(=O)(=O)[O-])cc1")
def test_reionize2(): """Partially ionized acid where proton should be moved to weaker acid.""" assert standardize_smiles('C1=C(C=CC(=C1)[P]([O-])(=O)O)[S](O)(=O)=O' ) == 'O=P(O)(O)c1ccc(S(=O)(=O)[O-])cc1'
def test_aromaticity3(): """Redo incorrect aromatization.""" eq_(standardize_smiles("C=Cc1ccc2c(c1)NC(=O)/C/2=C\\c1ccc[nH]1"), "C=Cc1ccc2c(c1)NC(=O)/C2=C\\c1ccc[nH]1") eq_(standardize_smiles("C=Cc1ccc2c(c1)[nH]c(=O)/c/2=C\\c1ccc[nH]1"), "C=Cc1ccc2c(c1)NC(=O)/C2=C\\c1ccc[nH]1")
def test_reionize3(): """Partially ionized acid where proton should be moved to weaker acid.""" assert standardize_smiles('C1=C(C=C(C(=C1)O)C(=O)[O-])[S](O)(=O)=O.[Na+]' ) == 'O=C(O)c1cc(S(=O)(=O)[O-])ccc1O.[Na+]'
def test_disconnect_metal2(): """Break metal-organic covalent bonds.""" eq_(standardize_smiles("c1ccccc1C(=O)O[Ca]OC(=O)c1ccccc1"), "[Ca+2].O=C([O-])c1ccccc1.O=C([O-])c1ccccc1")
def test_charge_preservation(): """Unusually charged histidine should be preserved. (See charge parent for normalization).""" assert standardize_smiles( '[NH3+]C(Cc1cnc[nH]1)C(=O)[O-]') == '[NH3+]C(Cc1cnc[nH]1)C(=O)[O-]'
def test_charge_free_metal(): """Charge free neutral metal with carboxylic acid.""" eq_(standardize_smiles("[Na].O=C(O)c1ccccc1"), "[Na+].O=C([O-])c1ccccc1")
def test_charge_preservation2(): """""" assert standardize_smiles('[Cl-].C[NH+](C)C') == 'C[NH+](C)C.[Cl-]'
def test_pyridine_oxide_normalization(): """Normalize pyridine oxide.""" eq_(standardize_smiles("C1=[N](C=CC=C1)=O"), "[O-][n+]1ccccc1")
def test_disconnect_metal6(): """""" assert standardize_smiles( 'C1(CCCCC1)[Zn]Br') == '[Br-].[CH-]1CCCCC1.[Zn+2]'
def test_pyrimidone_charge_recombination2(): """Recombine aromatic 1,3-separated charges to form pyrimidone.""" eq_( standardize_smiles("COc1cc2ccc3c4c(OC)cc(OC)c(OC)c4c([O-])[n+](C)c3c2cc1OC"), "COc1cc2ccc3c4c(OC)cc(OC)c(OC)c4c(=O)n(C)c3c2cc1OC", )
def test_positive_carbon_nitrogen(): """""" assert standardize_smiles('CN[C+](C)NC') == 'CNC(C)=[NH+]C'
def test_1_5_aromatic_charge_recombination(): """Recombine aromatic 1,5-separated charges.""" eq_(standardize_smiles("[n-]1ccc(=[N+](C)C)cc1"), "CN(C)c1ccncc1")
def test_positive_phosphorus_nitrogen(): """""" assert standardize_smiles('CN[P+](C)(C)NC') == 'CNP(C)(C)=[NH+]C'
def test_aromaticity2(): """Both rings should be aromatic.""" eq_(standardize_smiles("C[N]1C=NC2=C1C(=O)N(C)C(=O)N2C"), "Cn1cnc2c1c(=O)n(C)c(=O)n2C") eq_(standardize_smiles("Cn1cnc2c1c(=O)n(C)c(=O)n2C"), "Cn1cnc2c1c(=O)n(C)c(=O)n2C")
def test_stereochemistry(): """Check stereochemistry is correctly perceived.""" assert standardize_smiles('Cl\\C=C/Cl') == 'Cl/C=C\\Cl'
def test_charge_to_protonated_atom7(): """Shift positive charge from nonprotonated to protonated atom.""" eq_(standardize_smiles("CNc1cc[n+](C)cc1"), "C[NH+]=c1ccn(C)cc1")
def test_disconnect_metal(): """Break metal-organic covalent bonds.""" assert standardize_smiles( '[Na]OC(=O)c1ccccc1') == 'O=C([O-])c1ccccc1.[Na+]'
def test_charge_to_protonated_atom9(): """Shift positive charge from nonprotonated to protonated atom.""" eq_(standardize_smiles("CNC=CC=[N+](C)C"), "C[NH+]=CC=CN(C)C")
def test_disconnect_metal2(): """Break metal-organic covalent bonds.""" assert standardize_smiles('c1ccccc1C(=O)O[Ca]OC(=O)c1ccccc1' ) == 'O=C([O-])c1ccccc1.O=C([O-])c1ccccc1.[Ca+2]'
def test_equal_reionize(): """Don't change partially ionized acid with two equally strong acid groups.""" eq_(standardize_smiles("C1=C(C=CC(=C1)[S]([O-])(=O)=O)[S](O)(=O)=O"), "O=S(=O)([O-])c1ccc(S(=O)(=O)O)cc1")
def test_disconnect_metal3(): """Disconnect Pt in metal complex.""" assert standardize_smiles( '[Pt](Cl)(Cl)(O)(O)(NC(C)C)NC(C)C' ) == 'CC(C)[NH-].CC(C)[NH-].[Cl-].[Cl-].[OH-].[OH-].[Pt+6]'
def test_reionize3(): """Partially ionized acid where proton should be moved to weaker acid.""" eq_(standardize_smiles("C1=C(C=C(C(=C1)O)C(=O)[O-])[S](O)(=O)=O.[Na+]"), "[Na+].O=C(O)c1cc(S(=O)(=O)[O-])ccc1O")
def test_disconnect_metal4(): """Leave mercury covalently bonded.""" assert standardize_smiles( 'CC[Hg]SC1=C(C=CC=C1)C(=O)[O][Na]') == 'CC[Hg]Sc1ccccc1C(=O)[O-].[Na+]'
def test_charge_preservation2(): """""" eq_(standardize_smiles("[Cl-].C[NH+](C)C"), "[Cl-].C[NH+](C)C")
def test_disconnect_metal5(): """Silver carbonate. Unsure about this one.""" assert standardize_smiles('[Ag]OC(=O)O[Ag]') == 'O=C([O-])[O-].[Ag+].[Ag+]'
def test_disconnect_metal6(): """""" eq_(standardize_smiles("C1(CCCCC1)[Zn]Br"), "[Zn+2].[Br-].[CH-]1CCCCC1")
def test_charge_free_metal(): """Charge free neutral metal with carboxylic acid.""" assert standardize_smiles( '[Na].O=C(O)c1ccccc1') == 'O=C([O-])c1ccccc1.[Na+]'
def test_disconnect_metal(): """Break metal-organic covalent bonds.""" eq_(standardize_smiles("[Na]OC(=O)c1ccccc1"), "[Na+].O=C([O-])c1ccccc1")
def test_nitro_normalization(): """Normalize nitro group.""" assert standardize_smiles( 'C1(=CC=CC=C1)[N+](=O)[O-]') == 'O=[N+]([O-])c1ccccc1'
def test_disconnect_metal3(): """Disconnect Pt in metal complex.""" eq_(standardize_smiles("[Pt](Cl)(Cl)(O)(O)(NC(C)C)NC(C)C"), "[OH-].[OH-].[Cl-].[Cl-].[Pt+6].CC(C)[NH-].CC(C)[NH-]")
def test_nitro_normalization3(): """Normalize nitro group.""" assert standardize_smiles('[O-][N+](=O)c1ccccc1') == 'O=[N+]([O-])c1ccccc1'
def test_disconnect_metal5(): """Silver carbonate. Unsure about this one.""" eq_(standardize_smiles("[Ag]OC(=O)O[Ag]"), "[Ag+].[Ag+].O=C([O-])[O-]")
def test_nitro_normalization5(): """Normalize nitro group.""" assert standardize_smiles('O[N+](=O)[O-]') == 'O=[N+]([O-])O'
def test_nitro_normalization(): """Normalize nitro group.""" eq_(standardize_smiles("C1(=CC=CC=C1)[N+](=O)[O-]"), "O=[N+]([O-])c1ccccc1")
def test_pyridine_oxide_normalization(): """Normalize pyridine oxide.""" assert standardize_smiles('C1=[N](C=CC=C1)=O') == '[O-][n+]1ccccc1'
def test_nitro_normalization5(): """Normalize nitro group.""" eq_(standardize_smiles("O[N+](=O)[O-]"), "O=[N+]([O-])O")
def test_aromaticity(): """Check aromaticity is correctly perceived.""" eq_(standardize_smiles("C1=CC=CC=C1"), "c1ccccc1")
def test_standardize(): """Test table salt.""" assert standardize_smiles('[Na].[Cl]') == '[Cl-].[Na+]'
def test_pyrimidone_charge_recombination(): """Recombine aromatic 1,3-separated charges to form pyrimidone.""" eq_(standardize_smiles("[O-]c1[n+](C)cccc1"), "Cn1ccccc1=O")