50645e1
from pathlib import Path
50645e1
import io
50645e1
50645e1
import pytest
50645e1
import yaml
50645e1
50645e1
from pyproject_buildrequires import generate_requires
50645e1
d262d90
try:
d262d90
    import importlib.metadata as importlib_metadata
d262d90
except ImportError:
d262d90
    import importlib_metadata
d262d90
50645e1
testcases = {}
50645e1
with Path(__file__).parent.joinpath('testcases.yaml').open() as f:
50645e1
    testcases = yaml.safe_load(f)
50645e1
50645e1
50645e1
@pytest.mark.parametrize('case_name', testcases)
50645e1
def test_data(case_name, capsys, tmp_path, monkeypatch):
50645e1
    case = testcases[case_name]
50645e1
50645e1
    cwd = tmp_path.joinpath('cwd')
50645e1
    cwd.mkdir()
50645e1
    monkeypatch.chdir(cwd)
50645e1
aca2f6a
    if case.get('xfail'):
aca2f6a
        pytest.xfail(case.get('xfail'))
aca2f6a
8a60635
    for filename in 'pyproject.toml', 'setup.py', 'tox.ini':
8a60635
        if filename in case:
8a60635
            cwd.joinpath(filename).write_text(case[filename])
50645e1
d262d90
    def get_installed_version(dist_name):
d262d90
        try:
d262d90
            return str(case['installed'][dist_name])
d262d90
        except (KeyError, TypeError):
d262d90
            raise importlib_metadata.PackageNotFoundError(
d262d90
                f'info not found for {dist_name}'
d262d90
            )
d262d90
50645e1
    try:
50645e1
        generate_requires(
d262d90
            get_installed_version=get_installed_version,
bc156c4
            include_runtime=case.get('include_runtime', False),
d6e6bb7
            extras=case.get('extras', ''),
8a60635
            toxenv=case.get('toxenv', None),
50645e1
        )
50645e1
    except SystemExit as e:
50645e1
        assert e.code == case['result']
50645e1
    except Exception as e:
bc156c4
        if 'except' not in case:
bc156c4
            raise
50645e1
        assert type(e).__name__ == case['except']
50645e1
    else:
50645e1
        assert 0 == case['result']
50645e1
50645e1
        captured = capsys.readouterr()
50645e1
        assert captured.out == case['expected']