5
5
import sys
6
6
import collections
7
7
import math
8
+ from itertools import count
8
9
9
10
import py
10
11
import pytest
11
- from _pytest .mark import MarkDecorator , MarkerError
12
+ from _pytest .mark import MarkerError
12
13
13
14
14
15
import _pytest
@@ -776,19 +777,14 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
776
777
to set a dynamic scope using test context or configuration.
777
778
"""
778
779
from _pytest .fixtures import scopes
779
- # individual parametrized argument sets can be wrapped in a series
780
- # of markers in which case we unwrap the values and apply the mark
781
- # at Function init
782
- newkeywords = {}
780
+ from _pytest .mark import extract_argvalue
781
+
783
782
unwrapped_argvalues = []
784
- for i , argval in enumerate (argvalues ):
785
- while isinstance (argval , MarkDecorator ):
786
- newmark = MarkDecorator (argval .markname ,
787
- argval .args [:- 1 ], argval .kwargs )
788
- newmarks = newkeywords .setdefault (i , {})
789
- newmarks [newmark .markname ] = newmark
790
- argval = argval .args [- 1 ]
783
+ newkeywords = []
784
+ for maybe_marked_args in argvalues :
785
+ argval , newmarks = extract_argvalue (maybe_marked_args )
791
786
unwrapped_argvalues .append (argval )
787
+ newkeywords .append (newmarks )
792
788
argvalues = unwrapped_argvalues
793
789
794
790
if not isinstance (argnames , (tuple , list )):
@@ -803,8 +799,7 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
803
799
newmark = pytest .mark .skip (
804
800
reason = "got empty parameter set %r, function %s at %s:%d" % (
805
801
argnames , self .function .__name__ , fs , lineno ))
806
- newmarks = newkeywords .setdefault (0 , {})
807
- newmarks [newmark .markname ] = newmark
802
+ newkeywords = [{newmark .markname : newmark }]
808
803
809
804
if scope is None :
810
805
if self ._arg2fixturedefs :
@@ -848,12 +843,12 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
848
843
ids = idmaker (argnames , argvalues , idfn , ids , self .config )
849
844
newcalls = []
850
845
for callspec in self ._calls or [CallSpec2 (self )]:
851
- for param_index , valset in enumerate (argvalues ):
846
+ elements = zip (ids , argvalues , newkeywords , count ())
847
+ for a_id , valset , keywords , param_index in elements :
852
848
assert len (valset ) == len (argnames )
853
849
newcallspec = callspec .copy (self )
854
- newcallspec .setmulti (valtypes , argnames , valset , ids [param_index ],
855
- newkeywords .get (param_index , {}), scopenum ,
856
- param_index )
850
+ newcallspec .setmulti (valtypes , argnames , valset , a_id ,
851
+ keywords , scopenum , param_index )
857
852
newcalls .append (newcallspec )
858
853
self ._calls = newcalls
859
854
0 commit comments