Skip to content

Commit

Permalink
Merge pull request #132 from saroad2/argnames_can_be_lists
Browse files Browse the repository at this point in the history
parametrize_with_cases can get argnames as list
  • Loading branch information
smarie authored Sep 7, 2020
2 parents 09eae11 + 9edea6a commit d9c1411
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 14 deletions.
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)

0 comments on commit d9c1411

Please sign in to comment.