# Pylint doesn't play well with fixtures and dependency injection from pytest
# pylint: disable=redefined-outer-name

import os
import pytest

from buildstream.exceptions import ErrorDomain
from buildstream.plugins.sources.pip import _match_package_name
from buildstream._testing import cli, generate_project  # pylint: disable=unused-import

DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "pip",)


# Test that without ref, consistency is set appropriately.
@pytest.mark.datafiles(os.path.join(DATA_DIR, "no-ref"))
def test_no_ref(cli, datafiles):
    project = str(datafiles)
    generate_project(project)
    assert cli.get_element_state(project, "target.bst") == "no reference"


# Test that pip is not allowed to be the first source
@pytest.mark.datafiles(os.path.join(DATA_DIR, "first-source-pip"))
def test_first_source(cli, datafiles):
    project = str(datafiles)
    generate_project(project)
    result = cli.run(project=project, args=["show", "target.bst"])
    result.assert_main_error(ErrorDomain.ELEMENT, None)


# Test that error is raised when neither packges nor requirements files
# have been specified
@pytest.mark.datafiles(os.path.join(DATA_DIR, "no-packages"))
def test_no_packages(cli, datafiles):
    project = str(datafiles)
    generate_project(project)
    result = cli.run(project=project, args=["show", "target.bst"])
    result.assert_main_error(ErrorDomain.SOURCE, None)


# Test that pip source parses tar ball names correctly for the ref
@pytest.mark.parametrize(
    "tarball, expected_name, expected_version",
    [
        ("dotted.package-0.9.8.tar.gz", "dotted.package", "0.9.8"),
        ("hyphenated-package-2.6.0.tar.gz", "hyphenated-package", "2.6.0"),
        ("underscore_pkg-3.1.0.tar.gz", "underscore_pkg", "3.1.0"),
        ("numbers2and5-1.0.1.tar.gz", "numbers2and5", "1.0.1"),
        ("multiple.dots.package-5.6.7.tar.gz", "multiple.dots.package", "5.6.7"),
        ("multiple-hyphens-package-1.2.3.tar.gz", "multiple-hyphens-package", "1.2.3"),
        ("multiple_underscore_pkg-3.4.5.tar.gz", "multiple_underscore_pkg", "3.4.5"),
        ("shortversion-1.0.tar.gz", "shortversion", "1.0"),
        ("longversion-1.2.3.4.tar.gz", "longversion", "1.2.3.4"),
    ],
)
def test_match_package_name(tarball, expected_name, expected_version):
    name, version = _match_package_name(tarball)
    assert (expected_name, expected_version) == (name, version)
