from __future__ import absolute_import
from __future__ import unicode_literals

import io
import os

import pytest

from pre_commit_hooks.autopep8_wrapper import main


@pytest.mark.parametrize(
    ('input_src', 'expected_ret', 'output_src'),
    (
        ('print(1    + 2)\n', 1, 'print(1 + 2)\n'),
        ('print(1 + 2)\n', 0, 'print(1 + 2)\n'),
    ),
)
def test_main_failing(tmpdir, input_src, expected_ret, output_src):
    filename = tmpdir.join('test.py').strpath
    with io.open(filename, 'w') as file_obj:
        file_obj.write(input_src)
    ret = main([filename, '-i', '-v'])
    assert ret == expected_ret
    assert io.open(filename).read() == output_src


@pytest.yield_fixture
def in_tmpdir(tmpdir):
    pwd = os.getcwd()
    os.chdir(tmpdir.strpath)
    try:
        yield
    finally:
        os.chdir(pwd)


@pytest.mark.usefixtures('in_tmpdir')
def test_respects_config_file():
    with io.open('setup.cfg', 'w') as setup_cfg:
        setup_cfg.write('[pep8]\nignore=E221')

    with io.open('test.py', 'w') as test_py:
        test_py.write('print(1    + 2)\n')

    assert main(['test.py', '-i', '-v']) == 0
