def _test_path_bp_mf(branch_dist, godag, prt):
    """Test distances between BP branch and MF branch."""
    go_mf = 'GO:0003676'  # level-03 depth-03 nucleic acid binding [molecular_function]
    go_bp = 'GO:0007516'  # level-04 depth-05 hemocyte development [biological_process]
    dst_none = semantic_distance(go_mf, go_bp, godag)
    sim_none = semantic_similarity(go_mf, go_bp, godag)
    assc = dnld_assc("gene_association.tair", godag)
    termcounts = TermCounts(godag, assc)
    fmt = '({GO1}, {GO2}) {TYPE:6} score = {VAL}\n'
    sim_r = resnik_sim(go_mf, go_bp, godag, termcounts)
    sim_l = lin_sim(go_mf, go_bp, godag, termcounts)
    if prt is not None:
        prt.write(
            fmt.format(TYPE='semantic distance',
                       GO1=go_mf,
                       GO2=go_bp,
                       VAL=dst_none))
        prt.write(
            fmt.format(TYPE='semantic similarity',
                       GO1=go_mf,
                       GO2=go_bp,
                       VAL=sim_none))
        prt.write(
            fmt.format(TYPE='Resnik similarity',
                       GO1=go_mf,
                       GO2=go_bp,
                       VAL=sim_r))
        prt.write(
            fmt.format(TYPE='Lin similarity', GO1=go_mf, GO2=go_bp, VAL=sim_l))
    assert dst_none is None
    assert sim_none is None
    assert sim_r is None
    assert sim_l is None
    sim_d = semantic_distance(go_mf, go_bp, godag, branch_dist)
    if prt is not None:
        prt.write(
            fmt.format(TYPE='semantic distance',
                       GO1=go_mf,
                       GO2=go_bp,
                       VAL=sim_d))
    assert sim_d == godag[go_mf].depth + godag[go_bp].depth + branch_dist
def _test_path_same(godag, prt):
    """Test distances btween GO IDs on the same path."""
    goid_bottom = 'GO:0007516' # level-04 depth-05 hemocyte development [biological_process]
    # Test distances up the same branch
    goids_bp = [
        'GO:0008150', # level-00 depth-00 biological_process [biological_process]
        'GO:0009987', # level-01 depth-01 cellular process [biological_process]
        'GO:0044763', # level-02 depth-02 single-organism cellular process [biological_process]
        'GO:0048869', # level-03 depth-03 cellular developmental process [biological_process]
        'GO:0048468'] # level-03 depth-04 cell development [biological_process]
    fmt = '{DST} semantic_distance for {GO1} and {GO2} on the same branch\n'
    for dst_exp, goid in enumerate(reversed(goids_bp), 1):
        dst_act = semantic_distance(goid_bottom, goid, godag)
        if prt is not None:
            prt.write(fmt.format(DST=dst_act, GO1=goid_bottom, GO2=goid))
        assert dst_act == dst_exp
def _test_path_parallel(godag, prt):
    """Test distances between GO IDs on parallel branches."""
    goid_bottom = 'GO:0007516' # BP level-04 depth-05 hemocyte development
    # Test distances up a parallel branch
    goids = [
        'GO:0044763',  # BP level-02 depth-02 single-organism cellular process
        'GO:0008219',  # BP level-03 depth-03 cell death
        'GO:0070997',  # BP level-04 depth-04 neuron death
        'GO:0036475',  # BP level-05 depth-05 neuron death in response to oxidative stress
        'GO:0036476']  # BP level-06 depth-06 neuron death in response to hydrogen peroxide
    fmt = '{DST} semantic_distance between {GO1} and {GO2} on parallel branches\n'
    for dst_exp, goid in enumerate(goids, 3):
        dst_act = semantic_distance(goid_bottom, goid, godag)
        if prt is not None:
            prt.write(fmt.format(DST=dst_act, GO1=goid_bottom, GO2=goid))
        assert dst_act == dst_exp