def test_sort_group_by_agent_pair_custom_function():
    stmts = _get_sort_corpus()

    ha = HtmlAssembler(stmts,
                       sort_by=lambda d: 4 * d['trips'] + 2 * d['reach'] + 2 *
                       d['medscan'] + d['sparser'] - d['isi'])
    json_model = ha.make_json_model(grouping_level='agent-pair')
    assert list(json_model.keys()) == ['Fez-Baz', 'Bar-Baz', 'Fez-Bar']

    ha.make_model(grouping_level='agent-pair')
def test_sort_group_by_statement_sort_by_none():
    stmts = _get_sort_corpus()
    ha = HtmlAssembler(stmts, sort_by=None)

    json_model = ha.make_json_model(grouping_level='statement')
    statements = \
        json_model['all-statements']['stmts_formatted'][0]['stmt_info_list']
    got_h_list = [int(s['hash']) for s in statements]
    inp_h_list = [s.get_hash() for s in stmts]
    assert got_h_list == inp_h_list
def test_sort_group_by_relation():
    ha = HtmlAssembler(_get_sort_corpus())

    # Test ordering, grouping by relation.
    json_model = ha.make_json_model(grouping_level='relation')
    assert list(json_model.keys()) == ['all-relations']
    relations = json_model['all-relations']['stmts_formatted']
    assert len(relations) == 5, len(relations)

    # Make sure the HTML assembles.
    model = ha.make_model(grouping_level='relation')
    with open('test_relation.html', 'w') as f:
        f.write(model)
def test_sort_group_by_statement():
    ha = HtmlAssembler(_get_sort_corpus())

    # Test ordering and grouping by statement.
    json_model = ha.make_json_model(grouping_level='statement')
    assert list(json_model.keys()) == ['all-statements']
    assert len(json_model['all-statements']['stmts_formatted']) == 1
    statements = \
        json_model['all-statements']['stmts_formatted'][0]['stmt_info_list']
    assert len(statements) == 6
    assert [len(s['evidence']) for s in statements] == [4, 3, 2, 2, 1, 1]

    # Make sure the html assembly works.
    ha.make_model(grouping_level='statement')
def test_sort_group_by_statement_custom_function():
    stmts = _get_sort_corpus()

    ha = HtmlAssembler(stmts,
                       sort_by=lambda d: 4 * d['trips'] + 2 * d['reach'] + 2 *
                       d['medscan'] + d['sparser'] - d['isi'])
    json_model = ha.make_json_model(grouping_level='statement')
    statements = \
        json_model['all-statements']['stmts_formatted'][0]['stmt_info_list']
    assert len(statements) == len(stmts)
    exp_order = [
        '6106301533612997', '-17995265549545446', '34182032179844940',
        '32266861591785935', '-30059881887512900', '-5998595995539618'
    ]
    assert [s['hash'] for s in statements] == exp_order

    ha.make_model(grouping_level='statement')
def test_sort_group_by_agent_custom_ordering():
    stmts = _get_sort_corpus()

    custom_values = [0.1, 0.2, 0.15, 0.6, 0.3, 0.8]
    val_dict = {s.get_hash(): v for v, s in zip(custom_values, stmts)}

    custom_stat = StmtStat('value', val_dict, float, AveAggregator)

    ha = HtmlAssembler(stmts, sort_by='value', custom_stats=[custom_stat])
    json_model = ha.make_json_model(grouping_level='agent-pair')
    assert len(json_model.keys()) == 4

    # This result was slightly counter-intuitive, but recall that averages will
    # mean a grouping with the conversion will always have a lower value than
    # the conversion itself, so it makes sense for it to come out on top.
    assert list(json_model.keys()) == [
        'Fez-Far-Faz-Bar-Baz', 'Fez-Bar', 'Bar-Baz', 'Fez-Baz'
    ]

    ha.make_model(grouping_level='agent-pair')
def test_sort_group_by_statement_custom_ordering():
    stmts = _get_sort_corpus()

    custom_values = [0.1, 0.2, 0.15, 0.6, 0.3, 0.8]
    val_dict = {s.get_hash(): v for v, s in zip(custom_values, stmts)}

    custom_stat = StmtStat('value', val_dict, float, AveAggregator)

    ha = HtmlAssembler(stmts, sort_by='value', custom_stats=[custom_stat])
    json_model = ha.make_json_model(grouping_level='statement')

    statements = \
        json_model['all-statements']['stmts_formatted'][0]['stmt_info_list']
    got_h_list = [int(s['hash']) for s in statements]
    exp_h_list = sorted((h for h in val_dict.keys()),
                        key=lambda h: val_dict[h],
                        reverse=True)
    assert got_h_list == exp_h_list

    ha.make_model(grouping_level='statement')
def test_sort_group_by_relation_custom_function():
    stmts = _get_sort_corpus()

    ha = HtmlAssembler(stmts,
                       sort_by=lambda d: 4 * d['trips'] + 2 * d['reach'] + 2 *
                       d['medscan'] + d['sparser'] - d['isi'])
    json_model = ha.make_json_model(grouping_level='relation')
    relations = json_model['all-relations']['stmts_formatted']
    assert len(relations) == 5, len(relations)
    relation_names = [rel['short_name'] for rel in relations]
    exp_rel_names = [
        '<b>Bar</b> phosphorylates <b>Baz</b>.',
        '<b>Fez</b> inhibits <b>Baz</b>.',
        '<b>Bar</b> binds <b>Baz</b> and <b>Fez</b>.',
        '<b>Fez</b> decreases the amount of <b>Baz</b>.',
        '<b>Fez</b> catalyzes the conversion of <b>Far</b> and <b>Faz</b> into '
        '<b>Bar</b> and <b>Baz</b>.'
    ]
    assert relation_names == exp_rel_names, relation_names

    ha.make_model(grouping_level='relation')
def test_sort_default():
    ha = HtmlAssembler(_get_sort_corpus())

    # Test the ordering of the statements in the default mode of make_json_model
    json_model = ha.make_json_model()
    assert list(json_model.keys()) == ['Fez-Baz', 'Bar-Baz', 'Fez-Bar']
    exp_stmt_counts = {'Fez-Baz': 4, 'Bar-Baz': 2, 'Fez-Bar': 2}
    assert all(
        len(json_model[k]['stmts_formatted']) == n
        for k, n in exp_stmt_counts.items())
    ev_counts = {
        k: sum(
            len(s['evidence']) for r in m['stmts_formatted']
            for s in r['stmt_info_list'])
        for k, m in json_model.items()
    }
    assert ev_counts == {'Fez-Baz': 8, 'Bar-Baz': 7, 'Fez-Bar': 3}, ev_counts

    # Check to make sure the HTML assembler runs.
    model = ha.make_model()
    with open('test_agent_pair.html', 'w') as f:
        f.write(model)
def test_sort_group_by_relation_custom_ordering():
    stmts = _get_sort_corpus()

    custom_values = [0.1, 0.2, 0.15, 0.6, 0.3, 0.8]
    val_dict = {s.get_hash(): v for v, s in zip(custom_values, stmts)}

    custom_stat = StmtStat('value', val_dict, float, AveAggregator)

    ha = HtmlAssembler(stmts, sort_by='value', custom_stats=[custom_stat])
    json_model = ha.make_json_model(grouping_level='relation')
    assert list(json_model.keys()) == ['all-relations']
    relations = json_model['all-relations']['stmts_formatted']
    assert len(relations) == 5, len(relations)
    relation_names = [rel['short_name'] for rel in relations]
    exp_relation_names = [
        '<b>Fez</b> catalyzes the conversion of <b>Far</b> and <b>Faz</b> into '
        '<b>Bar</b> and <b>Baz</b>.', '<b>Bar</b> phosphorylates <b>Baz</b>.',
        '<b>Fez</b> decreases the amount of <b>Baz</b>.',
        '<b>Bar</b> binds <b>Baz</b> and <b>Fez</b>.',
        '<b>Fez</b> inhibits <b>Baz</b>.'
    ]
    assert relation_names == exp_relation_names

    ha.make_model(grouping_level='relation')