def test_heterocyclic_canonicalization(): """heterocyclic tautomer""" assert canonicalize_tautomer("n1ccc2ccc[nH]c12") == "c1cnc2[nH]ccc2c1" assert canonicalize_tautomer( "c1cc(=O)[nH]c2nccn12") == "O=c1ccn2cc[nH]c2n1" assert canonicalize_tautomer("c1cnc2c[nH]ccc12") == "c1cc2cc[nH]c2cn1" assert canonicalize_tautomer("n1ccc2c[nH]ccc12") == "c1cc2[nH]ccc2cn1" assert canonicalize_tautomer("c1cnc2ccc[nH]c12") == "c1cnc2cc[nH]c2c1"
def test_1_3_heteroatom_canonicalization(): """1,3 heteroatom H shift""" assert canonicalize_tautomer("OC(C)=NC") == "CNC(C)=O" assert canonicalize_tautomer("CNC(C)=O") == "CNC(C)=O" assert canonicalize_tautomer("S=C(N)N") == "NC(N)=S" assert canonicalize_tautomer("SC(N)=N") == "NC(N)=S" assert canonicalize_tautomer("N=c1[nH]ccn(C)1") == "Cn1cc[nH]c1=N" assert canonicalize_tautomer("CN=c1[nH]cncc1") == "CN=c1cc[nH]cn1"
def test_furanone_canonicalization(): """furanone tautomer""" assert canonicalize_tautomer("C1=CC=C(O1)O") == "Oc1ccco1" assert canonicalize_tautomer("O=C1CC=CO1") == "Oc1ccco1"
def test_1_11_aromatic_heteroatom_canonicalization(): """1,11 aromatic heteroatom H shift""" assert (canonicalize_tautomer("Nc1ccc(C=C2C=CC(=O)C=C2)cc1") == "Nc1ccc(C=C2C=CC(=O)C=C2)cc1") assert (canonicalize_tautomer("N=C1C=CC(=Cc2ccc(O)cc2)C=C1") == "Nc1ccc(C=C2C=CC(=O)C=C2)cc1")
def test_acetophenone_keto_enol_canonicalization(): """Acetophenone keto/enol tautomer""" assert canonicalize_tautomer("C(=C)(O)C1=CC=CC=C1") == "CC(=O)c1ccccc1"
def test_isocyanide_canonicalization(): """isocyanide tautomer""" assert canonicalize_tautomer("C#N") == "C#N" assert canonicalize_tautomer("[C-]#[NH+]") == "C#N"
def test_cyano_iso_cyanic_acid_canonicalization(): """cyano/iso-cyanic acid tautomer""" assert canonicalize_tautomer("C(#N)O") == "N=C=O" assert canonicalize_tautomer("C(=N)=O") == "N=C=O"
def test_oxim_nitroso_canonicalization(): """oxim nitroso tautomer""" assert canonicalize_tautomer("CC(C)=NO") == "CC(C)=NO" assert canonicalize_tautomer("CC(C)N=O") == "CC(C)=NO"
def test_special_imine_canonicalization(): """special imine tautomer""" assert canonicalize_tautomer("C1(C=CC=CN1)=CC") == "CCc1ccccn1" assert canonicalize_tautomer("C1(=NC=CC=C1)CC") == "CCc1ccccn1"
def test_1_5_keto_enol_canonicalization(): """1,5 keto/enol tautomer""" assert (canonicalize_tautomer("Oc1nccc2cc[nH]c(=N)c12") == "N=c1[nH]ccc2cc[nH]c(=O)c12") assert canonicalize_tautomer("C1(C=CCCC1)=O") == "O=C1C=CCCC1" assert canonicalize_tautomer("C1(=CC=CCC1)O") == "O=C1C=CCCC1"
def test_aliphatic_imine_canonicalization(): """aliphatic imine tautomer""" assert canonicalize_tautomer("C1(CCCCC1)=N") == "N=C1CCCCC1" assert canonicalize_tautomer("C1(=CCCCC1)N") == "N=C1CCCCC1"
def test_phenylpropanone_keto_enol_canonicalization(): """1-phenyl-2-propanone enol/keto""" assert canonicalize_tautomer("c1(ccccc1)CC(=O)C") == "CC(=O)Cc1ccccc1"
def test_keto_enol_canonicalization(): """keto/enol tautomer""" assert canonicalize_tautomer("OC(C)=C(C)C") == "CC(=O)C(C)C"
def test_acetone_keto_enol_canonicalization(): """Acetone keto/enol tautomer""" assert canonicalize_tautomer("CC(C)=O") == "CC(C)=O"
def test_keten_ynol_canonicalization(): """keten/ynol tautomer""" assert canonicalize_tautomer("CC=C=O") == "CC=C=O" assert canonicalize_tautomer("CC#CO") == "CC=C=O"
def test_1_5_aromatic_heteroatom_canonicalization(): """1,5 aromatic heteroatom H shift""" assert canonicalize_tautomer("Oc1cccc2ccncc12") == "Oc1cccc2ccncc12" assert canonicalize_tautomer("O=c1cccc2cc[nH]cc1-2") == "Oc1cccc2ccncc12" assert canonicalize_tautomer("Cc1n[nH]c2ncnn12") == "Cc1n[nH]c2ncnn12" assert canonicalize_tautomer("Cc1nnc2nc[nH]n12") == "Cc1n[nH]c2ncnn12" assert canonicalize_tautomer("Oc1ccncc1") == "O=c1cc[nH]cc1" assert (canonicalize_tautomer("Oc1c(cccc3)c3nc2ccncc12") == "O=c1c2ccccc2[nH]c2ccncc12") assert (canonicalize_tautomer("C2(=C1C(=NC=N1)[NH]C(=N2)N)O") == "N=c1[nH]c(=O)c2[nH]cnc2[nH]1") assert (canonicalize_tautomer("C2(C1=C([NH]C=N1)[NH]C(=N2)N)=O") == "N=c1[nH]c(=O)c2[nH]cnc2[nH]1") assert canonicalize_tautomer("Oc1n(C)ncc1") == "Cn1[nH]ccc1=O" assert canonicalize_tautomer("O=c1nc2[nH]ccn2cc1") == "O=c1ccn2cc[nH]c2n1" assert canonicalize_tautomer("N=c1nc[nH]cc1") == "N=c1cc[nH]cn1" assert canonicalize_tautomer( "N=c(c1)ccn2cc[nH]c12") == "N=c1ccn2cc[nH]c2c1" assert canonicalize_tautomer("CN=c1nc[nH]cc1") == "CN=c1cc[nH]cn1"
def test_ionic_nitro_aci_nitro_canonicalization(): """ionic nitro/aci-nitro tautomer""" assert canonicalize_tautomer("C([N+](=O)[O-])C") == "CC[N+](=O)[O-]" assert canonicalize_tautomer("C(=[N+](O)[O-])C") == "CC[N+](=O)[O-]"
def test_1_3_1_5_aromatic_heteroatom_canonicalization(): """1,3 and 1,5 aromatic heteroatom H shift""" assert canonicalize_tautomer("Oc1ncncc1") == "O=c1cc[nH]cn1"
def test_oxim_nitroso_phenol_canonicalization(): """oxim/nitroso tautomer via phenol""" assert canonicalize_tautomer("O=Nc1ccc(O)cc1") == "O=Nc1ccc(O)cc1" assert canonicalize_tautomer("O=C1C=CC(=NO)C=C1") == "O=Nc1ccc(O)cc1"
def test_1_7_aromatic_heteroatom_canonicalization(): """1,7 aromatic heteroatom H shift""" assert (canonicalize_tautomer("c1ccc2[nH]c(-c3nc4ccccc4[nH]3)nc2c1") == "c1ccc2[nH]c(-c3nc4ccccc4[nH]3)nc2c1") assert (canonicalize_tautomer("c1ccc2c(c1)NC(=C1N=c3ccccc3=N1)N2") == "c1ccc2[nH]c(-c3nc4ccccc4[nH]3)nc2c1")
def test_formamidinesulfinic_acid_canonicalization(): """formamidinesulfinic acid tautomer""" assert canonicalize_tautomer("N=C(N)S(=O)O") == "N=C(N)S(=O)O"
def test_1_9_aromatic_heteroatom_canonicalization(): """1,9 aromatic heteroatom H shift""" assert canonicalize_tautomer("CNc1ccnc2ncnn21") == "CN=c1cc[nH]c2ncnn12" assert canonicalize_tautomer( "CN=c1ccnc2nc[nH]n21") == "CN=c1cc[nH]c2ncnn12"
def test_phosphonic_acid_canonicalization(): """phosphonic acid tautomer""" assert canonicalize_tautomer("[PH](=O)(O)(O)") == "O=[PH](O)O" assert canonicalize_tautomer("P(O)(O)O") == "O=[PH](O)O"
def test_1_3_keto_enol_canonicalization(): """1,3 keto/enol tautomer""" assert canonicalize_tautomer("C1(=CCCCC1)O") == "O=C1CCCCC1" assert canonicalize_tautomer("C1(CCCCC1)=O") == "O=C1CCCCC1"