"""Test sphinx.util.docstrings."""

from sphinx.util.docstrings import prepare_commentdoc, prepare_docstring, separate_metadata


def test_separate_metadata():
    # metadata only
    text = (":meta foo: bar\n"
            ":meta baz:\n")
    docstring, metadata = separate_metadata(text)
    assert docstring == ''
    assert metadata == {'foo': 'bar', 'baz': ''}

    # non metadata field list item
    text = (":meta foo: bar\n"
            ":param baz:\n")
    docstring, metadata = separate_metadata(text)
    assert docstring == ':param baz:\n'
    assert metadata == {'foo': 'bar'}

    # field_list like text following just after paragraph is not a field_list
    text = ("blah blah blah\n"
            ":meta foo: bar\n"
            ":meta baz:\n")
    docstring, metadata = separate_metadata(text)
    assert docstring == text
    assert metadata == {}

    # field_list like text following after blank line is a field_list
    text = ("blah blah blah\n"
            "\n"
            ":meta foo: bar\n"
            ":meta baz:\n")
    docstring, metadata = separate_metadata(text)
    assert docstring == "blah blah blah\n\n"
    assert metadata == {'foo': 'bar', 'baz': ''}

    # non field_list item breaks field_list
    text = (":meta foo: bar\n"
            "blah blah blah\n"
            ":meta baz:\n")
    docstring, metadata = separate_metadata(text)
    assert docstring == ("blah blah blah\n"
                         ":meta baz:\n")
    assert metadata == {'foo': 'bar'}


def test_prepare_docstring():
    docstring = """multiline docstring

                Lorem ipsum dolor sit amet, consectetur adipiscing elit,
                sed do eiusmod tempor incididunt ut labore et dolore magna
                aliqua::

                  Ut enim ad minim veniam, quis nostrud exercitation
                    ullamco laboris nisi ut aliquip ex ea commodo consequat.
                """

    assert (prepare_docstring(docstring) ==
            ["multiline docstring",
             "",
             "Lorem ipsum dolor sit amet, consectetur adipiscing elit,",
             "sed do eiusmod tempor incididunt ut labore et dolore magna",
             "aliqua::",
             "",
             "  Ut enim ad minim veniam, quis nostrud exercitation",
             "    ullamco laboris nisi ut aliquip ex ea commodo consequat.",
             ""])

    docstring = """

                multiline docstring with leading empty lines
                """
    assert (prepare_docstring(docstring) ==
            ["multiline docstring with leading empty lines",
             ""])

    docstring = "single line docstring"
    assert (prepare_docstring(docstring) ==
            ["single line docstring",
             ""])


def test_prepare_commentdoc():
    assert prepare_commentdoc("hello world") == []
    assert prepare_commentdoc("#: hello world") == ["hello world", ""]
    assert prepare_commentdoc("#:  hello world") == [" hello world", ""]
    assert prepare_commentdoc("#: hello\n#: world\n") == ["hello", "world", ""]
