import ast

import pytest

from pre_commit_hooks.check_builtin_literals import BuiltinTypeCall
from pre_commit_hooks.check_builtin_literals import BuiltinTypeVisitor
from pre_commit_hooks.check_builtin_literals import main
from testing.util import get_resource_path


@pytest.fixture
def visitor():
    return BuiltinTypeVisitor()


@pytest.mark.parametrize(
    ('expression', 'calls'),
    [
        # complex
        ("0j", []),
        ("complex()", [BuiltinTypeCall('complex', 1, 0)]),
        ("complex(0, 0)", []),
        ("complex('0+0j')", []),
        ('builtins.complex()', []),
        # float
        ("0.0", []),
        ("float()", [BuiltinTypeCall('float', 1, 0)]),
        ("float('0.0')", []),
        ('builtins.float()', []),
        # int
        ("0", []),
        ("int()", [BuiltinTypeCall('int', 1, 0)]),
        ("int('0')", []),
        ('builtins.int()', []),
        # list
        ("[]", []),
        ("list()", [BuiltinTypeCall('list', 1, 0)]),
        ("list('abc')", []),
        ("list([c for c in 'abc'])", []),
        ("list(c for c in 'abc')", []),
        ('builtins.list()', []),
        # str
        ("''", []),
        ("str()", [BuiltinTypeCall('str', 1, 0)]),
        ("str('0')", []),
        ('builtins.str()', []),
        # tuple
        ("()", []),
        ("tuple()", [BuiltinTypeCall('tuple', 1, 0)]),
        ("tuple('abc')", []),
        ("tuple([c for c in 'abc'])", []),
        ("tuple(c for c in 'abc')", []),
        ('builtins.tuple()', []),
    ],
)
def test_non_dict_exprs(visitor, expression, calls):
    visitor.visit(ast.parse(expression))
    assert visitor.builtin_type_calls == calls


@pytest.mark.parametrize(
    ('expression', 'calls'),
    [
        ("{}", []),
        ("dict()", [BuiltinTypeCall('dict', 1, 0)]),
        ("dict(a=1, b=2, c=3)", []),
        ("dict(**{'a': 1, 'b': 2, 'c': 3})", []),
        ("dict([(k, v) for k, v in [('a', 1), ('b', 2), ('c', 3)]])", []),
        ("dict((k, v) for k, v in [('a', 1), ('b', 2), ('c', 3)])", []),
        ('builtins.dict()', []),
    ],
)
def test_dict_allow_kwargs_exprs(visitor, expression, calls):
    visitor.visit(ast.parse(expression))
    assert visitor.builtin_type_calls == calls


@pytest.mark.parametrize(
    ('expression', 'calls'),
    [
        ("dict()", [BuiltinTypeCall('dict', 1, 0)]),
        ("dict(a=1, b=2, c=3)", [BuiltinTypeCall('dict', 1, 0)]),
        ("dict(**{'a': 1, 'b': 2, 'c': 3})", [BuiltinTypeCall('dict', 1, 0)]),
        ('builtins.dict()', []),
    ],
)
def test_dict_no_allow_kwargs_exprs(expression, calls):
    visitor = BuiltinTypeVisitor(allow_dict_kwargs=False)
    visitor.visit(ast.parse(expression))
    assert visitor.builtin_type_calls == calls


def test_ignore_constructors():
    visitor = BuiltinTypeVisitor(ignore=('complex', 'dict', 'float', 'int', 'list', 'str', 'tuple'))
    visitor.visit(ast.parse(open(get_resource_path('builtin_constructors.py'), 'rb').read(), 'builtin_constructors.py'))
    assert visitor.builtin_type_calls == []


def test_failing_file():
    rc = main([get_resource_path('builtin_constructors.py')])
    assert rc == 1


def test_passing_file():
    rc = main([get_resource_path('builtin_literals.py')])
    assert rc == 0


def test_failing_file_ignore_all():
    rc = main([
        '--ignore=complex,dict,float,int,list,str,tuple',
        get_resource_path('builtin_constructors.py'),
    ])
    assert rc == 0
