def link_refs(osistext, ref):
    com = osistext.find_all('div', annotateRef=str(ref))
    assert len(com) == 1
    com = com[0]
    link = com.find('list', cls='reference_links')
    if link:
        return set([Ref(i['osisRef'][5:]) for i in link.find_all('reference')])
    else:
        return set()
def test_merge_comments():
    osistext = BeautifulSoup(
        """
        <osisText>
        <div annotateRef="Gen.1.1-Gen.1.4" annotateType="commentary"><reference>blah1</reference></div>
        <div annotateRef="Gen.1.2-Gen.1.4" annotateType="commentary"><reference>blah2</reference></div>
        <div annotateRef="Gen.1.2" annotateType="commentary"><reference>blah3</reference></div>
        <div annotateRef="Gen.1.3" annotateType="commentary"><reference>blah4</reference></div>
        </osisText>
    """, 'xml')

    s = Study2Osis(options)
    s.root_soup = s.osistext = osistext
    s.fix_overlapping_ranges()
    result = osistext.prettify()
    print result
    assert link_refs(osistext, 'Gen.1.1') == set()
    assert link_refs(osistext, 'Gen.1.2') == {Ref('Gen.1.1')}
    assert link_refs(osistext, 'Gen.1.4') == {Ref('Gen.1.1'), Ref('Gen.1.2')}
def test_overlapping_1():
    osistext = BeautifulSoup("""
        <osisText>
        <div annotateRef="Gen.1.1-Gen.1.4" annotateType="commentary"><reference>blah1</reference></div>
        <div annotateRef="Gen.1.2-Gen.1.4" annotateType="commentary"><reference>blah2</reference></div>
        <div annotateRef="Gen.1.3" annotateType="commentary"><reference>blah3</reference></div>
        </osisText>
    """, 'xml')

    s = Commentary(options)
    s.root_soup = osistext
    s.osistext = osistext.find('osisText')
    s.expand_all_ranges()
    s.fix_overlapping_ranges()
    result = osistext.prettify()
    print(result)
    assert link_refs(osistext, 'Gen.1.1') == set()
    assert link_refs(osistext, 'Gen.1.2') == {Ref('Gen.1.1')}
    assert link_refs(osistext, 'Gen.1.3') == {Ref('Gen.1.1'), Ref('Gen.1.2')}
    assert link_refs(osistext, 'Gen.1.4') == {Ref('Gen.1.1'), Ref('Gen.1.2')}
def test_commentless_verse_within_rangecomment():
    osistext = BeautifulSoup(
        """
        <osisText>
        <div annotateRef="Gen.1.1-Gen.1.4" annotateType="commentary"><reference>blah1</reference></div>
        <div annotateRef="Gen.1.2" annotateType="commentary"><reference>blah2</reference></div>

        <div annotateRef="Gen.1.4" annotateType="commentary"><reference>blah4</reference></div>
        </osisText>
    """, 'xml')
    # here, we want to create empty comment in verse 3 and add link there (instead of linking to verse 1).

    s = Study2Osis(options)
    s.root_soup = s.osistext = osistext
    s.fix_overlapping_ranges()
    result = osistext.prettify()
    print result
    assert link_refs(osistext, 'Gen.1.1') == set()
    assert link_refs(osistext, 'Gen.1.2') == {Ref('Gen.1.1')}
    assert link_refs(osistext, 'Gen.1.3') == {Ref('Gen.1.1')}
    assert link_refs(osistext, 'Gen.1.4') == {Ref('Gen.1.1')}
def test_guess_range_end():
    h = HTML2OsisMixin()
    g = h._guess_range_end
    c = lambda x: BeautifulSoup('<a>%s</a>'%x, 'xml').a
    assert g(Ref('Gen.1.1'), c('1:1-3')) == Ref('Gen', 1, 3)
    assert g(Ref('Isa.11.1'), c('Isa. 11:1-10')) == Ref('Isa.11.10')
    assert g(Ref('Isa.11.1'), c('Isa. 11:1-12:10')) == Ref('Isa.12.10')
    assert g(Ref('Isa.11.1'), c('11:1-12:10')) == Ref('Isa.12.10')
    assert g(Ref('Isa.11.1'), c('Isa 11:1-10')) == Ref('Isa.11.10')
    assert g(Ref('Isa.11.1'), c('Isa 11:1-12:10')) == Ref('Isa.12.10')
    assert g(Ref('1Cor.3.16'), c('1 Cor. 3:16–17')) == Ref('1Cor.3.17')
    assert g(Ref('1Cor.3.16'), c('vv. 16-17')) == Ref('1Cor.3.17')
def test_ref():
    assert Ref('Rev.1.1') > Ref('Jude.1.1')
    assert Ref('Rev.1.2') > Ref('Rev.1.1')
    assert Ref('Rev.2.1') > Ref('Rev.1.1')
    assert Ref('Gen.1.1') < Ref('Jude.1.1')
    assert '%s' % Ref('Gen.1.1') == 'Gen.1.1'
    assert '%s' % Ref('Jude.1.1') == 'Jude.1.1'
    assert Ref('Gen.1.1') == Ref('Gen.1.1')
    assert Ref('SOMEBOOK:Gen.1.1') == Ref('Gen.1.1')
    assert Ref('Gen.1.1') in [Ref('Gen.1.1')]
    assert Ref('Gen.1.1') in {Ref('Gen.1.1'): 1}
    assert sorted([Ref('Gen.1.1'), Ref('Gen.2.1')]) == [Ref("Gen.1.1"), Ref("Gen.2.1")]
    assert sorted([Ref('Gen.1.1'), Ref('Exod.2.1')]) == [Ref("Gen.1.1"), Ref("Exod.2.1")]
    assert sorted([Ref('Rev.1.1'), Ref('Exod.2.1')]) == [Ref("Exod.2.1"), Ref("Rev.1.1")]
    assert next(Ref('Gen.1.1')) == Ref('Gen.1.2')
    assert next(Ref('Gen.1.31')) == Ref('Gen.2.1')
    assert next(Ref('Gen.50.25')) == Ref('Gen.50.26')
    assert next(Ref('Gen.50.26')) == Ref('Exod.1.1')
    assert list(xrefrange(Ref('Gen.1.1'), 'Gen.1.4')) == [Ref("Gen.1.1"), Ref("Gen.1.2"), Ref("Gen.1.3"), Ref("Gen.1.4")]
    assert Ref('Rev', 1, 1) == Ref('Rev.1.1')