refactor resolve_arg_value_types
* more explicit type checks * expand from list+tuple to sequence
This commit is contained in:
		
							parent
							
								
									898028cb22
								
							
						
					
					
						commit
						2c071a060e
					
				|  | @ -1,11 +1,12 @@ | ||||||
| """ Python test discovery, setup and run of test functions. """ | """ Python test discovery, setup and run of test functions. """ | ||||||
| import collections |  | ||||||
| import enum | import enum | ||||||
| import fnmatch | import fnmatch | ||||||
| import inspect | import inspect | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
| import warnings | import warnings | ||||||
|  | from collections import Counter | ||||||
|  | from collections.abc import Sequence | ||||||
| from functools import partial | from functools import partial | ||||||
| from textwrap import dedent | from textwrap import dedent | ||||||
| 
 | 
 | ||||||
|  | @ -1042,12 +1043,9 @@ class Metafunc(fixtures.FuncargnamesCompatAttr): | ||||||
|             * "params" if the argname should be the parameter of a fixture of the same name. |             * "params" if the argname should be the parameter of a fixture of the same name. | ||||||
|             * "funcargs" if the argname should be a parameter to the parametrized test function. |             * "funcargs" if the argname should be a parameter to the parametrized test function. | ||||||
|         """ |         """ | ||||||
|         valtypes = {} |         if isinstance(indirect, bool): | ||||||
|         if indirect is True: |             valtypes = dict.fromkeys(argnames, "params" if indirect else "funcargs") | ||||||
|             valtypes = dict.fromkeys(argnames, "params") |         elif isinstance(indirect, Sequence): | ||||||
|         elif indirect is False: |  | ||||||
|             valtypes = dict.fromkeys(argnames, "funcargs") |  | ||||||
|         elif isinstance(indirect, (tuple, list)): |  | ||||||
|             valtypes = dict.fromkeys(argnames, "funcargs") |             valtypes = dict.fromkeys(argnames, "funcargs") | ||||||
|             for arg in indirect: |             for arg in indirect: | ||||||
|                 if arg not in argnames: |                 if arg not in argnames: | ||||||
|  | @ -1058,6 +1056,13 @@ class Metafunc(fixtures.FuncargnamesCompatAttr): | ||||||
|                         pytrace=False, |                         pytrace=False, | ||||||
|                     ) |                     ) | ||||||
|                 valtypes[arg] = "params" |                 valtypes[arg] = "params" | ||||||
|  |         else: | ||||||
|  |             fail( | ||||||
|  |                 "In {func}: expected Sequence or boolean for indirect, got {type}".format( | ||||||
|  |                     type=type(indirect).__name__, func=self.function.__name__ | ||||||
|  |                 ), | ||||||
|  |                 pytrace=False, | ||||||
|  |             ) | ||||||
|         return valtypes |         return valtypes | ||||||
| 
 | 
 | ||||||
|     def _validate_if_using_arg_names(self, argnames, indirect): |     def _validate_if_using_arg_names(self, argnames, indirect): | ||||||
|  | @ -1185,7 +1190,7 @@ def idmaker(argnames, parametersets, idfn=None, ids=None, config=None, item=None | ||||||
|     if len(set(ids)) != len(ids): |     if len(set(ids)) != len(ids): | ||||||
|         # The ids are not unique |         # The ids are not unique | ||||||
|         duplicates = [testid for testid in ids if ids.count(testid) > 1] |         duplicates = [testid for testid in ids if ids.count(testid) > 1] | ||||||
|         counters = collections.defaultdict(lambda: 0) |         counters = Counter() | ||||||
|         for index, testid in enumerate(ids): |         for index, testid in enumerate(ids): | ||||||
|             if testid in duplicates: |             if testid in duplicates: | ||||||
|                 ids[index] = testid + str(counters[testid]) |                 ids[index] = testid + str(counters[testid]) | ||||||
|  |  | ||||||
|  | @ -599,6 +599,17 @@ class TestMetafunc: | ||||||
|         assert metafunc._calls[0].funcargs == dict(x="a", y="b") |         assert metafunc._calls[0].funcargs == dict(x="a", y="b") | ||||||
|         assert metafunc._calls[0].params == {} |         assert metafunc._calls[0].params == {} | ||||||
| 
 | 
 | ||||||
|  |     def test_parametrize_indirect_wrong_type(self): | ||||||
|  |         def func(x, y): | ||||||
|  |             pass | ||||||
|  | 
 | ||||||
|  |         metafunc = self.Metafunc(func) | ||||||
|  |         with pytest.raises( | ||||||
|  |             pytest.fail.Exception, | ||||||
|  |             match="In func: expected Sequence or boolean for indirect, got dict", | ||||||
|  |         ): | ||||||
|  |             metafunc.parametrize("x, y", [("a", "b")], indirect={}) | ||||||
|  | 
 | ||||||
|     def test_parametrize_indirect_list_functional(self, testdir): |     def test_parametrize_indirect_list_functional(self, testdir): | ||||||
|         """ |         """ | ||||||
|         #714 |         #714 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue