Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

parametrize_with_cases can get argnames as list #132

Merged
merged 4 commits into from
Sep 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pytest_cases/case_parametrizer_new.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
pass


def parametrize_with_cases(argnames, # type: str
def parametrize_with_cases(argnames, # type: Union[str, List[str], Tuple[str, ...]]
cases=AUTO, # type: Union[Callable, Type, ModuleRef]
prefix=CASE_PREFIX_FUN, # type: str
glob=None, # type: str
Expand Down
33 changes: 20 additions & 13 deletions pytest_cases/fixture_parametrize_plus.py
Original file line number Diff line number Diff line change
Expand Up @@ -800,24 +800,31 @@ def _get_argnames_argvalues(argnames=None, argvalues=None, **args):
# simplify if needed to comply with pytest.mark.parametrize
if len(argnames) == 1:
argvalues = [l[0] if not is_marked_parameter_value(l) else l for l in argvalues]
return argnames, argvalues

elif isinstance(argnames, string_types):
if isinstance(argnames, string_types):
# (2) argnames + argvalues, as usual. However **args can also be passed and should be added
argnames = get_param_argnames_as_list(argnames)

if argvalues is None:
raise ValueError("No argvalues provided while argnames are provided")
if not isinstance(argnames, (list, tuple)):
raise TypeError("argnames should be a string, list or a tuple")

# transform argvalues to a list (it can be a generator)
try:
argvalues = list(argvalues)
except TypeError:
raise InvalidParamsList(argvalues)

# append **args
if len(kw_argnames) > 0:
argnames, argvalues = cart_product_pytest((argnames, kw_argnames),
(argvalues, kw_argvalues))
if any([not isinstance(argname, str) for argname in argnames]):
raise TypeError("all argnames should be strings")

if argvalues is None:
raise ValueError("No argvalues provided while argnames are provided")

# transform argvalues to a list (it can be a generator)
try:
argvalues = list(argvalues)
except TypeError:
raise InvalidParamsList(argvalues)

# append **args
if len(kw_argnames) > 0:
argnames, argvalues = cart_product_pytest((argnames, kw_argnames),
(argvalues, kw_argvalues))

return argnames, argvalues

Expand Down
34 changes: 34 additions & 0 deletions pytest_cases/tests/cases/doc/test_parametrize_alt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import pytest

from pytest_cases import parametrize_with_cases


def case_sum_one_plus_two():
a = 1
b = 2
c = 3
return a, b, c


@parametrize_with_cases(argnames=["a", "b", "c"], cases=".")
def test_argnames_as_list(a, b, c):
assert a + b == c


@parametrize_with_cases(argnames=("a", "b", "c"), cases=".")
def test_argnames_as_tuple(a, b, c):
assert a + b == c


def test_argnames_from_invalid_type():
with pytest.raises(
TypeError, match="^argnames should be a string, list or a tuple$"
):
parametrize_with_cases(argnames=42, cases=".")(lambda _: None)


def test_argnames_element_from_invalid_type():
with pytest.raises(
TypeError, match="^all argnames should be strings$"
):
parametrize_with_cases(argnames=["a", 2, "c"], cases=".")(lambda _: None)