# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals

import ast

import pytest

from pre_commit_hooks.debug_statement_hook import debug_statement_hook
from pre_commit_hooks.debug_statement_hook import DebugStatement
from pre_commit_hooks.debug_statement_hook import ImportStatementParser
from testing.util import get_resource_path


@pytest.fixture
def ast_with_no_debug_imports():
    return ast.parse(
        """
import foo
import bar
import baz
from foo import bar
""",
    )


@pytest.fixture
def ast_with_debug_import_form_1():
    return ast.parse(
        """

import ipdb; ipdb.set_trace()

""",
    )


@pytest.fixture
def ast_with_debug_import_form_2():
    return ast.parse(
        """

from pudb import set_trace; set_trace()

""",
    )


def test_returns_no_debug_statements(ast_with_no_debug_imports):
    visitor = ImportStatementParser()
    visitor.visit(ast_with_no_debug_imports)
    assert visitor.debug_import_statements == []


def test_returns_one_form_1(ast_with_debug_import_form_1):
    visitor = ImportStatementParser()
    visitor.visit(ast_with_debug_import_form_1)
    assert visitor.debug_import_statements == [
        DebugStatement('ipdb', 3, 0),
    ]


def test_returns_one_form_2(ast_with_debug_import_form_2):
    visitor = ImportStatementParser()
    visitor.visit(ast_with_debug_import_form_2)
    assert visitor.debug_import_statements == [
        DebugStatement('pudb', 3, 0),
    ]


def test_returns_one_for_failing_file():
    ret = debug_statement_hook([get_resource_path('file_with_debug.notpy')])
    assert ret == 1


def test_returns_zero_for_passing_file():
    ret = debug_statement_hook([__file__])
    assert ret == 0


def test_syntaxerror_file():
    ret = debug_statement_hook([get_resource_path('cannot_parse_ast.notpy')])
    assert ret == 1


def test_non_utf8_file(tmpdir):
    f_py = tmpdir.join('f.py')
    f_py.write_binary('# -*- coding: cp1252 -*-\nx = "€"\n'.encode('cp1252'))
    assert debug_statement_hook((f_py.strpath,)) == 0
