from __future__ import absolute_import
from __future__ import unicode_literals

import io

import pytest

from pre_commit_hooks.check_docstring_first import check_docstring_first
from pre_commit_hooks.check_docstring_first import main


# Contents, expected, expected_output
TESTS = (
    # trivial
    ('', 0, ''),
    # Acceptable
    ('"foo"', 0, ''),
    # Docstrin after code
    (
        'from __future__ import unicode_literals\n'
        '"foo"\n',
        1,
        '{filename}:2 Module docstring appears after code '
        '(code seen on line 1).\n'
    ),
    # Test double docstring
    (
        '"The real docstring"\n'
        'from __future__ import absolute_import\n'
        '"fake docstring"\n',
        1,
        '{filename}:3 Multiple module docstrings '
        '(first docstring on line 1).\n'
    ),
    # Test multiple lines of code above
    (
        'import os\n'
        'import sys\n'
        '"docstring"\n',
        1,
        '{filename}:3 Module docstring appears after code '
        '(code seen on line 1).\n',
    ),
    # String literals in expressions are ok.
    ('x = "foo"\n', 0, ''),
)


all_tests = pytest.mark.parametrize(
    ('contents', 'expected', 'expected_out'), TESTS,
)


@all_tests
def test_unit(capsys, contents, expected, expected_out):
    assert check_docstring_first(contents) == expected
    assert capsys.readouterr()[0] == expected_out.format(filename='<unknown>')


@all_tests
def test_integration(tmpdir, capsys, contents, expected, expected_out):
    tmpfilename = tmpdir.join('test.py').strpath
    with io.open(tmpfilename, 'w') as tmpfile:
        tmpfile.write(contents)

    assert main([tmpfilename]) == expected
    assert capsys.readouterr()[0] == expected_out.format(filename=tmpfilename)
